Rails在每次创建/更新请求时都保存IP地址

时间:2009-09-16 08:52:04

标签: ruby-on-rails session ip env

我想做以下事情:

before_filter中定义application.rb,提取用户的IP地址并将其存储在任何位置,最好是在会话中。

在我的所有模型中定义两个过滤器,如before_create和before_update,将当前用户的IP添加到要存储的对象。

问题:我无法在模型中访问session[] env[]。任何人都可以使用我还不知道的标准解决方案吗?

此致 杰森

5 个答案:

答案 0 :(得分:5)

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

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 :(得分:1)

您无法按照自己的意愿行事,因为Rails 设计不允许您访问模型中的会话信息。这是MVC关注的经典分离。模型意味着独立于其他层工作,当你开始使用Rake或其他没有会话的系统任务时,你会感谢他们做的事情。

cattr_accessor :current_ip

是一种可怕的方法。这是一个黑客,它应该是明显的原因。是的,它可能有用,但这是解决这个问题的错误方法。

由于您正在跟踪“谁”通过其IP执行“什么”,因此在此处发生的逻辑位置在控制器层中。您可以采用多种方法,包括使用CacheSweepers作为审核员,如Rails Recipes一书中所述。 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"

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

这有帮助吗?

答案 2 :(得分:0)

如果要在会话中保存IP,可以在applicationController中创建before过滤器。像这样,对于每个动作,都会调用过滤器并存储ip。

答案 3 :(得分:0)

authlogic是一个管理用户登录/会话等的插件,它有一个内置选项来跟踪用户IP

答案 4 :(得分: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