我目前正在设置身份验证系统。 我的application_controller.rb包含:
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
我正在使用教程创建重置密码选项,它说要将其添加到我的application_controller.rb中:
def current_user
@current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
end
我可以将这些结合起来吗?
答案 0 :(得分:1)
要直接回答您的问题,在控制器中使用相同名称的实例变量是完全正常的。
例如
#users_controller.rb
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
#other code
end
如您所见,两者都能够在同一个控制器中使用@user
的实例变量。
您现在面临的问题实际上并不是关于使用相同的实例变量,而是在method names
中使用相同的application_controller
。
换句话说,你做不到
def new_method
#do something
end
def new_method
#do something else
end
答案 1 :(得分:1)
如果不确切地知道你想要编写什么代码,很难给出具体的答案,但是你可以做以接受这两点:
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
@current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
end
这会为你的会话[:user_id]设置优先级,但如果你想要反过来,只需颠倒两行的顺序。
答案 2 :(得分:0)
def current_user
@current_user ||= find_user_by_id || find_user_by_token
end
private
def find_user_by_id
User.find(session[:user_id]) if session[:user_id]
end
def find_user_by_token
User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
end
def current_user
@current_user ||= (session[:user_id] && User.find(session[:user_id])) ||
(cookies[:auth_token] && User.find_by_auth_token!(cookies[:auth_token]))
end