Ruby on Rail中是否可以有两个具有相同名称的实例变量?

时间:2016-12-13 04:00:30

标签: ruby-on-rails ruby

我目前正在设置身份验证系统。 我的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

我可以将这些结合起来吗?

3 个答案:

答案 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