考虑这段代码
module Auth
def sign_in(user)
#some stuff
session[:user_id] = user.id
end
end
现在,我想将它包含在我的应用程序控制器中。
ApplicationController < ActionController::Base
include Auth
end
这使得该sign_in
方法在我所有的控制器中都可用。现在,为了明确这不是控制器动作,我想保留名称,所以我的控制器读取
def sign_user_in
# Some stuff
Auth.sign_in(@user)
end
这显然是行不通的,因为 Rails 会在 Auth 模块中寻找类方法。所以问题是......是否可以在控制器中包含一个模块,保留它的名称或命名空间,但仍然可以访问与控制器相同的范围?(在这种情况下,会话变量)。
到目前为止,我想出的最不坏的方法是停止在 ApplicationController 中包含模块,而是在调用这样的 auth 方法时传递应用程序控制器实例:
def current_user(controller)
User.find(controller.session[:user_id])
end
使用 usingself
作为参数从控制器调用此方法有效。