我想做以下事情:
在before_filter
中定义application.rb
,提取用户的IP地址并将其存储在任何位置,最好是在会话中。
在我的所有模型中定义两个过滤器,如before_create和before_update,将当前用户的IP添加到要存储的对象。
问题:我无法在模型中访问session[]
env[]
。任何人都可以使用我还不知道的标准解决方案吗?
此致 杰森
答案 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