寻找在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的生命周期。在请求期间,值是否可能发生变化?
我主要想知道上述内容是否安全,以及是否有更好的方法。
答案 0 :(得分:2)
回答问题的第一部分。该属性将保存在内存中,直到User-class被刷新/发送到垃圾收集器。这通常是在VM或解释器关闭时。
在像Heroku这样的环境中,此变量可以存储在请求之间,未经身份验证的用户可以通过访问此变量来访问最新用户,除非在第一个用户完成时将其清除。
答案 1 :(得分:1)
如果您想要符合最佳实践,这绝对是正确的方法。 current_user
是一种控制器方法,通过遵循Chain-of-responsibility模式,User
模型不应该知道当前用户是谁。
答案 2 :(得分:0)
这不是一种安全的方法:)保持控制器中的状态和模型中的业务逻辑。
如果需要将current_user传递给模型层,那么模型不应该关心它是谁。您始终可以使用关联来过滤对内容的访问。
current_user.widgets.find(params[:id])