Определите, какое действие вызывается внутри модели. Рубин на рельсах - PullRequest
0 голосов
/ 16 сентября 2010

Как я узнаю, вызвано ли создание или какое-либо другое действие изнутри модели.В основном я веду журнал базы данных и хочу отслеживать, выполняются ли действия create или другие.

Для выполнения части ведения журнала я использую концепцию ActiveRecord :: Observer .Но там я не могу узнать, создает ли пользователь или делает что-то еще.Поэтому, пожалуйста, скажите мне, как рельсы позволяют нам определить действие внутри модели.

заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 16 сентября 2010

Такой вид отслеживания должен выполняться на контроллере. Наблюдатели осведомлены только о модели и должны знать только модель.

Рассмотрим случай, когда вы обновляете объект с консоли. Наблюдатель будет активирован, но у вас нет контекста запроса здесь.

1 голос
/ 16 сентября 2010

То, какое действие вызывается в приложении, хранится в params [: action], а params недоступен в моделях.Поэтому я не думаю, что вы можете видеть, какое действие вызывается из моделей.

Спасибо, Анубхоу

0 голосов
/ 16 сентября 2010

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

ApplicationController или просто один контроллер:

around_filter :store_remote_ip_in_thread

def store_remote_ip_in_thread
  begin
    Thread.current[:remote_ip] = request.remote_ip
    yield
  ensure
    Thread.current.delete :remote_ip
  end
end

Многоразовый модуль для поиска:

module RemoteIpAware
  def current_remote_ip
    Thread.current[:remote_ip] || '-'
  end
end

Где-то в классе модель / почтовик / библиотека:

 include RemoteIpAware
 ...
 #use current_remote_ip method anywhere

Имейте в виду, я написал это из моей памяти .. синтаксис может быть не в порядке;) В вашем случае вместо удаленного IP вы можете сохранить параметры [: action]: имя контроллера и т.д ..

0 голосов
/ 16 сентября 2010

Вы можете использовать before_save для запуска события при сохранении модели. Чтобы определить, является ли это сохранением или созданием, у вас есть метод new_record? , который сообщит вам, является ли он новым экземпляром или нет. Вы также можете узнать, какие атрибуты изменены

...