Rails сохраняет IP-адрес при каждом запросе на создание / обновление - PullRequest
4 голосов
/ 16 сентября 2009

Я бы хотел сделать следующее:

определяет before_filter в application.rb, который извлекает IP-адрес пользователя и сохраняет его где угодно, предпочтительно в сеансе.

определить два фильтра before во всех моих моделях как before_create и before_update, которые добавляют IP текущего пользователя к сохраняемому объекту.

Проблема: я не могу получить доступ ни к session[], ни к env[] в модели. Может кто-нибудь помочь со стандартным решением, которое я еще не знаю?

С уважением Jason

Ответы [ 5 ]

5 голосов
/ 16 сентября 2009

Попробуй это. В вашей модели пользователя добавьте атрибут доступа к классу

cattr_accessor :current_ip

В вашем контроллере приложения добавьте:

before_filter :set_current_ip

protected
def set_current_ip
    User.current_ip = request.env['REMOTE_ADDR']
end

Тогда в вашей модели вы сможете просто вызвать User.current_ip

Мы делаем что-то похожее для прохождения объекта current_user.

1 голос
/ 19 сентября 2009

Вам трудно делать то, что вы хотите, потому что Rails предназначен , чтобы не иметь доступа к информации о сеансе в ваших моделях. Это классическое разделение проблем с MVC. Модели предназначены для работы независимо от других ваших слоев, и вы будете благодарны им, когда вы начнете делать что-то с Rake или другими системными задачами, когда у вас не будет сессии.

The

cattr_accessor :current_ip

это ужасный подход. Это взлом, и должно быть понятно почему. Да, это может сработать, но это неправильный подход к этой проблеме.

Поскольку вы отслеживаете "кто" сделал "что" по их IP, логическое место для этого - на уровне контроллера. Есть несколько подходов, которые вы можете использовать, включая использование CacheSweepers в качестве аудиторов, как описано в книге Rails Recipes. CacheSweepers могут наблюдать за моделями, но также имеют доступ ко всей информации контроллера. Используя атрибуты ditry в модели рельсов, вы можете точно увидеть, что изменилось.

@user  = User.find_by_login "bphogan"
@user.login = "Brian"
@user.save
@user.changed
=> ["login"]
@user.changes
=> {"login"=>["bphogan", "brian"]}
@user.login_was
=> "bphogan"

Объедините это с имеющейся у вас информацией о сеансе, и у вас получится довольно классный одитор.

Это помогает?

0 голосов
/ 01 февраля 2011

Что вам действительно нужно, так это плагин управления версиями - я предлагаю взглянуть на одно из прекрасных решений по адресу http://ruby -toolbox.com / Categories / activerecord_versioning.html

Редактировать: архивная версия этой ссылки (с 2012 года было 404): https://web.archive.org/web/20111004161536/http://ruby-toolbox.com:80/categories/activerecord_versioning.html

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

authlogic - это плагин для управления входом пользователей / сессиями и т. Д., Он имеет встроенную опцию для отслеживания пользователей IP

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

Если вы хотите сохранить IP-адрес в сеансе, вы можете создать фильтр before в applicationController. Таким образом, для каждого действия вызывается фильтр, и ip сохраняется.

...