2012-03-23 7 views
14

Tengo una aplicación donde hay dos tipos de usuario actualmente, administrador y proveedor, y quiero registrar sus actividades comolas actividades del usuario Acceder ROR

"TestAdmin" viewed transaction 
"TestAdmin" added a new vendor 
"TestAdmin" edited a Transaction 
"TestVendor" added a new Transaction 
"TestAdmin" approved Transaction 
"TestAdmin" rejected Transaction 
etc... 

donde "TestAdmin" es un administrador y "TestVendor "es un proveedor

Pero no estoy seguro de lo que debería seguir el enfoque i

yo estoy pensando de esta

Adición de una mesa de actividades en la base de datos con los siguientes campos

user_id 
browser 
session_id 
ip_address 
action 
params 

y llamar

before_filter :record_activity 

para registrar todas las actividades

pero no sabe cómo crear mensajes como el anterior

También quiero averiguar si se produce algún error y cuándo y Por eso, entonces para esto tomo los campos del navegador para descubrir si el código no funciona en IE, etc. pero este es solo un campo de seguimiento de error.

Por favor, ayuda y guía a una buena manera de lograr esto.

Gracias

Respuesta

21

Ok esto es lo que hice ...

En primer lugar crear la tabla

create_table "activity_logs", :force => true do |t| 
    t.string "user_id" 
    t.string "browser" 
    t.string "ip_address" 
    t.string "controller" 
    t.string "action" 
    t.string "params" 
    t.string "note" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

función creada en el controlador de aplicación

def record_activity(note) 
    @activity = Activity_Log.new 
    @activity.user = current_user 
    @activity.note = note 
    @activity.browser = request.env['HTTP_USER_AGENT'] 
    @activity.ip_address = request.env['REMOTE_ADDR'] 
    @activity.controller = controller_name 
    @activity.action = action_name 
    @activity.params = params.inspect 
    @activity.save 
end 

luego llamar a la función anterior desde cualquier controlador necesario como este. ...

class AccountsController < ApplicationController 
     load_and_authorize_resource 

     # POST /accounts 
     # POST /accounts.json 
    def create 
     @account = Account.new(params[:account]) 
     respond_to do |format| 
     if @account.save 
     record_activity("Created new account") #This will call application controller record_activity 
     format.js { head :ok } 
     else 
     format.js { render json: @account.errors, :error => true, :success => false } 
     end 
    end 
    end 

Por lo tanto problema resuelto ......

Gracias a todos por toda su ayuda ....

+0

Me gusta esta solución. Gran idea, gracias. También agregué un campo de objetos y serializo el objeto 'to_json' para que pueda ver el cambio de estado, ¡y también para ver los artículos que fueron destruidos! –

+4

Tengo que decir que obviamente está acoplado. Está bien para proyectos pequeños, pero causará serios problemas a medida que sus proyectos crezcan más y más. –

+0

Entonces, ¿cómo viste la actividad después de eso? usaste un gráfico específico para eso. Además, puede ser útil agregar el tipo de navegador en su actividad. Estoy usando la gema del navegador para ver que –

8

Hay par de plugins en los carriles para poner en práctica este tipo de funcionalidad modelo se refiere. Usé acts_as_audited que cumplió con mi requisito.

Conocí uno más record_activities, pero no sé más sobre él. Espero que te pueda ayudar!

+0

he usado acts_as_audited y guardar los datos de usuario modal muy bien cuando se edita una información del usuario, pero cuando editado transacción que no guarda ninguna cosa en audtis mesa. En ambas clases modales, incluyo "acts_as_audited: protect => false", any diea? ¿También cómo usar esto en controladores no reparadores? –

+0

Y de hecho quiero registrar cada acción en la tabla de auditoría no solo crear y actualizar, como "Admin view Transaction" etc. –

+0

Use acts_as_audited luego use un filtro en sus controladores para agregar sus propios registros a la pista de auditoría de acts_as_audited. –

1

creo que se debe configurar la función modelo en el que se capta la acción como after_save, after update y todo, si el modelo es de transacción para los campos de la tabla Los registros se pueden

user_id, 
model_name, 
action, 
ip_address, 
session_id, 
params 
+0

Esto funcionará bien si solo desea realizar un seguimiento de los cambios, pero si desea rastrear qué registros ha visto un usuario, no funcionará. –

1

yo sugeriría que se haga estos campos en su "actividad" DB:

model = name of the model ex. "Vendor", "Transaction" 
user_id = id of user 
belongsTo = id of user that own the action/created the action etc.. 
action = name of the action 

y en su "modelo de actividad" añadir una función

log_activity(model, user_id, belongsTo, action) 
log = Activity.new 
log.model = model 
log.user_id = user_id 
log.belongsTo = belongsTo 
log.action = action 
log.save 
end 

then in you other models that you want to log add callbacks like: 
before_create :log 
before_update :log 
before_destroy :log 


def log 
    Activity.log_activity(self.class, self.user_id, self.belongsTo, self.action) 
    # assuming you have this fields on you forms 
end 
0

Tengo que decir que la respuesta de @Anil D obviamente está acoplada. Está bien para proyectos pequeños, pero causará problemas serios (desarrollo, depuración, mantenimiento de problemas) a medida que sus proyectos crezcan más y más.

Prefiero auditar: (https://github.com/collectiveidea/audited), que es una solución limpia simple & destinada únicamente a las actividades del usuario. Es compatible con Rails3 y asociaciones.

Cuestiones relacionadas