Зарегистрировать действия пользователя в ROR

У меня есть приложение, в котором сейчас есть два типа пользователей: Admin и Vendor, и я хочу регистрировать их действия, например

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

где "TestAdmin" является администратором, а "TestVendor" является поставщиком

Но я не уверен, какой подход я должен придерживаться

Я думаю об этом

Добавление таблицы активности в БД со следующими полями

user_id 
browser
session_id
ip_address
action
params

и вызовите

before_filter :record_activity

для записи всех действий

но не уверен, как создавать такие сообщения, как указано выше

Также я хочу выяснить, произошла ли какая-либо ошибка, и когда и почему, поэтому для этого я беру поля браузера, чтобы выяснить, не работает ли код в IE и т.д., но это только одно поле отслеживания ошибок.

Пожалуйста, помогите и руководствуйтесь каким-нибудь хорошим способом для этого.

Спасибо

Ответ 1

Хорошо, вот что я сделал...

Сначала создайте таблицу

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

созданная функция в контроллере приложения

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

затем вызовите функцию выше с любого контроллера как это....

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

Следовательно, проблема решена......

Спасибо всем за их помощь....

Ответ 2

Есть несколько плагинов в рельсах для реализации такого рода функциональности по модели. Я использовал acts_as_audited, который выполнил мое требование.

Я узнал еще об record_activities, но не знаю больше об этом. Надеюсь, это поможет вам!

Ответ 4

Я думаю, вы должны установить функцию модели, где она ловит действие как after_save, after update и все, если ваша модель является транзакцией для полей таблицы журналов, может быть

user_id,
model_name,
action,
ip_address,
session_id,
params

Ответ 5

Я предлагаю вам иметь эти поля в вашей базе данных "Активность":

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

и в вашей "Activity Model" добавьте функцию

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

Ответ 6

Я должен сказать, что ответ @Anil D, очевидно, связан. Это нормально для небольших проектов, но это вызовет серьезные проблемы (разработка, отладка, сохранение проблем), так как ваши проекты становятся все больше и больше.

Я предпочитаю аудит: (https://github.com/collectiveidea/audited), который представляет собой простое и чистое решение, предназначенное только для пользовательских действий. Он поддерживает Rails3 и ассоциации.

Ответ 7

Я знаю, что это старый, извините за воскресение...

Я пытаюсь реализовать принятый ответ в своем приложении (это маленькое приложение, которое никогда не получит большого размера, поэтому решение идеально).

Я сгенерировал и запустил миграцию, добавил функцию record_activity в ApplicationController и реализовал ее в моих методах действия, но я получаю следующую ошибку (например, при запуске из профиля пользователя):

NameError in UsersController#profile
uninitialized constant ApplicationController::Activity_Log

Нужно ли мне также генерировать модель Activity_Log? Если так, что я должен добавить в модель нового метода действия?

Должен ли я просто иметь следующее?

class Activity_Log < ApplicationRecord
end