Rails教程:复制方法名称,记住并记住(用户),忘记和忘记(用户)

时间:2014-10-29 18:50:24

标签: ruby-on-rails ruby methods duplicates railstutorial.org

在Rails教程的第8章中,定义了四种方法。一个叫做remember(列出8.32),没有参数,另一个叫做remember(用户)(列表8.35)。然后有一个名为forget(列出8.38)而没有参数的方法,以及一个忘记(用户)方法(清单8.39)。

我理解认证机制背后的逻辑,我不知道的是为什么这些方法对不会相互冲突或相互冲突,具有相同的名称,即。

是因为一个方法没有传递给它的参数而另一个需要一个?这是Rails如何区分他们的?或者是其他事情正在发生,以便Rails知道要调用哪种方法。

提前感谢您的帮助。

更新:感谢评论中的建议,我将在此处重现代码:

在用户模型 user.rb 文件中,有以下方法:


def remember
  self.remember_token = User.new_token
  update_attribute(:remember_digest, User.digest(remember_token))
end
...
def forget
  update_attribute(:remember_digest, nil)
end
...

在文件 sessions_helper.rb 中,这是Session模型的助手所在的位置,作者定义了这两种方法:


  def remember(user)
    user.remember
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
  end

  def forget(user)
    user.forget
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
  end

令我烦恼的是,即使有两个具有相同名称的方法(尽管一个不接受任何参数而另一个接受一个,即用户),代码仍然有效。

我必须补充一下,sessions_helper.rb包含在Application Helper文件中,因此它们是通用的。

2 个答案:

答案 0 :(得分:0)

Ruby不支持方法覆盖,如果有的话 在类中定义具有相同名称的方法 - 最新的覆盖 以前的定义。

在这种情况下,只能通过用户对象访问/调用 user.rb 中的方法。

def remember(user)
    user.remember // invoked by user object
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
end

您会发现,如果您向助手方法发送非用户对象,它将返回错误,因为此方法只能由用户对象访问。

如果您要在不同的类中定义具有相同名称的方法,则它们的工作方式相同,因为它们只能通过相应的类访问。

如果要将助手包含在控制器中并在控制器中添加一个与辅助方法同名的方法,则控制器方法将覆盖前一种方法。这与在同一个控制器中添加两个具有相同名称的方法相同。如上所述,ruby不允许方法覆盖。

答案 1 :(得分:0)

forgetUser类的实例方法 forget(user)SessionsHelper模块的实例方法。

是。 SessionsHelper之前已包含ApplicationHelper,但User类并未继承。{/ p>

这就是为什么这两个实例方法之间没有冲突的原因。它们只是具有相同名称的不同范围内的不同实例方法。