0

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

我目前在每个请求开始时将 User 模型上的类属性设置为 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 在这种情况下的生命周期。在请求期间值是否可能会改变?

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

4

3 回答 3

2

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

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

于 2012-02-26T03:17:08.530 回答
1

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

于 2012-02-26T02:30:08.593 回答
0

这不是一种安全的方法:) 将您的状态保存在控制器中,并将业务逻辑保存在模型中。

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

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

于 2012-02-26T02:43:47.453 回答