我有SessionsHelper
,这是我定义current_user
:
module SessionsHelper
def current_user
@current_user ||= user_from_remember_token
end
.
.
.
private
def user_from_remember_token
User.authenticate_with_salt(*remember_token)
end
def remember_token
cookies.signed[:remember_token] || [nil, nil]
end
end
我的UsersController
有一个before_filter :authenticate
。此身份验证位于SessionsHelper
,我在这里遇到了麻烦。
Rails为我处理所有Cookie,但我构建了一个API来为我的移动应用程序使用令牌,我必须在登录时发送params[:api_token]
并设置current_user
。
我想我必须做类似的事情:
def current_user
@current_user ||=(user_from_remember_token || user_from_api_token)
end
但我被困了,因为我不确定我是否可以通过助手中的params[:api_token]
。
有人能指出我正确的方向吗?
编辑:我也有,class ApplicationController < ActionController::Base
protect_from_forgery
include SessionsHelper
...
end
允许我使用before_filter:从UsersController进行身份验证并在SessionsHelper中访问此方法
答案 0 :(得分:2)
如果您在 UsersController 中包含 SessionsHelper , SessionsHelper 中定义的方法应该可以访问 PARAMS
答案 1 :(得分:0)
如果你在帮助器中定义了一些应该可供所有视图使用的东西,那么你应该把它放到ApplicationHelper中。
另外,我想你会想在某些时候在你的控制器中使用这些方法。因此,您确实应该在ApplicationController中定义它们,然后使用helper_method函数将它们标记为辅助方法。
以下是一个例子:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :authenticate
private
def authenticate
redirect_to root_url, :alert => 'You must log in to access this page' unless current_user
end
def current_user
@current_user ||= User.find_by_auth_token(cookies[:auth_token]) if cookies[:auth_token]
end
helper_method :current_user
end
因此无需在任何地方传递params,因为ApplicationController可以直接访问它。