Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails教程:复制方法名、记住和记住(用户)、忘记和忘记(用户)_Ruby On Rails_Ruby_Methods_Duplicates_Railstutorial.org - Fatal编程技术网

Ruby on rails Rails教程:复制方法名、记住和记住(用户)、忘记和忘记(用户)

Ruby on rails Rails教程:复制方法名、记住和记住(用户)、忘记和忘记(用户),ruby-on-rails,ruby,methods,duplicates,railstutorial.org,Ruby On Rails,Ruby,Methods,Duplicates,Railstutorial.org,在Rails教程的第8章中,定义了四种方法。一个名为RememberListing8.32,没有参数,另一个名为RememberUserListing8.35。然后有一个名为forget的方法,清单8.38中没有参数,还有一个forgetuser方法,清单8.39 我理解身份验证机制背后的逻辑,但我不明白为什么这些方法对彼此之间没有冲突或冲突,即名称相同 是因为一个方法没有参数传递给它,而另一个方法需要参数吗?Rails就是这样区分它们的吗?或者正在进行其他操作,以便Rails知道要调用哪个方法

在Rails教程的第8章中,定义了四种方法。一个名为RememberListing8.32,没有参数,另一个名为RememberUserListing8.35。然后有一个名为forget的方法,清单8.38中没有参数,还有一个forgetuser方法,清单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文件中,即会话模型的助手所在的位置,作者定义了以下两种方法:


  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\u helper.rb包含在Application helper文件中,因此它们是通用的。

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
您会发现,如果将非用户对象发送给帮助器方法,它将返回一个错误,因为此方法只能由用户对象访问

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不允许方法重写。

忘记是用户类的实例方法。 forgetuser是SessionHelper模块的一个实例方法

对。SessionHelper先前包含在ApplicationHelper中,但用户类既不继承也不继承


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

您能否发布一些困扰您的代码,以便我们了解实际情况?谢谢您的建议。我编辑了问题以包含代码。非常感谢您的解释!