了解Rails模型的class属性的生命周期

时间:2012-02-26 02:12:56

标签: ruby-on-rails ruby lifecycle class-attributes

寻找在Rails模型中进行所有权验证的最佳方法,而不会使我的控制器膨胀。这意味着我需要以某种方式将current_user传递给模型。

我目前正在每个请求开头将User模型的class属性设置为current_user:

class User < ActiveRecord::Base
  cattr_accessor :current_user
end

class ApplicationController < ActionController::Base
   before_filter :set_current_user
   def set_current_user
     User.current_user = current_user
   end
end

我不确定在这种情况下我是否完全理解User.current_user的生命周期。在请求期间,值是否可能发生变化?

我主要想知道上述内容是否安全,以及是否有更好的方法。

3 个答案:

答案 0 :(得分:2)

回答问题的第一部分。该属性将保存在内存中,直到User-class被刷新/发送到垃圾收集器。这通常是在VM或解释器关闭时。

在像Heroku这样的环境中,此变量可以存储在请求之间,未经身份验证的用户可以通过访问此变量来访问最新用户,除非在第一个用户完成时将其清除。

答案 1 :(得分:1)

如果您想要符合最佳实践,这绝对是正确的方法。 current_user是一种控制器方法,通过遵循Chain-of-responsibility模式,User模型不应该知道当前用户是谁。

答案 2 :(得分:0)

这不是一种安全的方法:)保持控制器中的状态和模型中的业务逻辑。

如果需要将current_user传递给模型层,那么模型不应该关心它是谁。您始终可以使用关联来过滤对内容的访问。

current_user.widgets.find(params[:id])