railstutorial.org有一个建议,让我觉得有点奇怪。
class ApplicationController < ActionController::Base
protect_from_forgery
include SessionsHelper
end
是的,include SessionsHelper
使这些方法在ApplicationController
中可用,但它也使它们在任何视图中都可用。我知道身份验证/授权是交叉的,但这真的是最好的地方吗?
在我看来,这可能是一个过于宽泛的范围。将实现有条件重定向(如railstutorial.org示例)的before_filter
的代码放在通常包含视图帮助器的模块中似乎很奇怪。
在视图中并不严格需要的功能放在ApplicationController或其他地方会更好吗?
还是我想得太多了?
发布于 2011-05-20 04:51:00
事实上,你的感觉是正确的。
我会以另一种方式实现这一点:将函数sign_in
和current_user
添加到ApplicationController
中(或者,如果您真想这样做的话:在lib
中定义的单独模块中并包含它),然后确保current_user
方法在视图中可用。
简而言之:
class ApplicationController
helper_method :current_user
def sign_in
end
def current_user
@current_user ||= user_from_remember_token
end
end
当然,如果您有很多代码要放到ApplicationController
中,它可能会变得杂乱无章。在这种情况下,我将创建一个文件lib\session_management.rb
module SessionManagement
def self.included(base)
base.helper_method :current_user
end
def sign_in
..
end
def current_user
..
end
end
在你的控制器中,你可以这样写:
class ApplicationController
include SessionManagement
end
发布于 2011-05-25 11:30:04
FWIW,我将当前用户存储在user类中:
class User < ActiveRecord::Base
cattr_accessor :current
...
end
这可以在所有3个MVC层中引用;它在控制器中是这样设置的(当然,登录时也是如此):
def set_current_user
User.current = (session[:user_id]) ? User.find_by_id(session[:user_id]) : nil
end
除了其他功能之外,这还允许我拥有ActiveRecord级别的审计日志,以捕获当前用户(如果适用)。
https://stackoverflow.com/questions/5500322
复制相似问题