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

Jas*_*rer 4 ip session env ruby-on-rails

我想做以下事情:

定义一个before_filterapplication.rb任何地方提取用户的IP地址,并将其存储,最好是在会话.

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

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

关心杰森

Lee*_*ing 5

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

cattr_accessor :current_ip
Run Code Online (Sandbox Code Playgroud)

在应用程序控制器中添加:

before_filter :set_current_ip

protected
def set_current_ip
    User.current_ip = request.env['REMOTE_ADDR']
end
Run Code Online (Sandbox Code Playgroud)

然后在您的模型中,您应该只能调用User.current_ip

我们做类似的事情来获取current_user对象.

  • 此解决方案是一种强制攻击,可将特定于实例的数据强制进入类中.如果你曾经想要使用这个,那么你就会遇到问题.您还将模型耦合到控制器层.这使得使用模型进行后台作业变得更加困难,因为您需要存在会话数据,而当您使用控制台或Rake运行时,它将不会.审核当前用户和ip信息的正确位置在控制器层,因为这是请求通过的地方.您可以使用around过滤器或cachesweepers在控制器层执行此操作. (4认同)