4

I'd like to do the following:

define a before_filter in application.rb that extracts the user's IP address and stores it anywhere, preferably in the session.

define two before filters in all my models as before_create and before_update that add the current user's IP to the object to be stored.

Problem: I cannot access session[] neither env[] in a model. Can anyone help with a standard solution that I don't know yet?

Regards Jason

4

5 回答 5

6

尝试这个。在您的用户模型中添加一个类属性访问器

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 对象通过。

于 2009-09-16T15:59:38.500 回答
1

您在做您想做的事时遇到了麻烦,因为 Rails 的设计不允许您访问模型中的会话信息。这是 MVC 的经典关注点分离。模型旨在独立于您的其他层工作,当您开始使用 Rake 或其他您不会有会话的系统任务时,您会感谢它们所做的。

cattr_accessor :current_ip

是一种可怕的方法。这是一个黑客,应该很明显为什么。是的,它可能有效,但这是解决此问题的错误方法。

由于您通过他们的 IP 跟踪“谁”做了“什么”,因此发生这种情况的逻辑位置是在控制器层。您可以采用多种方法,包括使用 CacheSweepers 作为审计员,如 Rails 食谱书中所述。CacheSweepers 可以观察模型,但也可以访问所有控制器信息。使用 rails 模型中的 ditry 属性,您可以准确地看到发生了什么变化。

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

将此与您拥有的会话信息结合起来,您就有了一个非常棒的审核员。

这有帮助吗?

于 2009-09-19T06:00:39.480 回答
0

If you want to save the IP in the session, you can create a before filter in the applicationController. Like this, for each action, the filter is called and the ip is stored.

于 2009-09-16T08:55:30.417 回答
0

authlogic is a plugin to manage users login/sessions etc, it has a built in option to track the users IP

于 2009-09-16T08:58:03.863 回答
0

你真正需要的是一个版本控制插件——我建议看看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

于 2011-02-01T12:36:24.310 回答