0

抱歉,我无法更好地表达这个问题。我正在关注 Michael Hartl 的 Rails 教程。这是一本了不起的书,在这个 sign_in 方法之前我完全理解了一切

module SessionsHelper
  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
  end
......

在 SessionsController 中使用了 helper 方法

class SessionsController < ApplicationController
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_to user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end
......

我知道 self 对当前对象进行评估,而 current_user 是一个属性。但是这里的当前对象是什么?谁调用了登录(用户)?

4

2 回答 2

0

该控制器方法中的 self 是实际的控制器实例,它可以访问它,因为该模块包含在类中,基本上使用其中声明的方法扩展其功能,当调用时在类的实例中运行,就像方法一样在类内部定义。您可以在此处阅读有关这些内容的更多信息。

如果您因为该类上不存在该方法而收到错误,那是因为您没有包含该模块,如对类似问题的回答中所示。(书中有解释)。

现在,在此评论中直接访问控制器时出现错误的原因。是您没有像 rails 路由器那样正确设置它,添加了所有请求信息和其他对象,例如 cookie jar。

如果您想知道它是如何工作的,请查看动作包调度程序:

SessionController.action(:new).call(env)

env来自调度程序从机架一路返回的请求,基本上就是你从 HTTP 请求中得到的,一个以标头作为键,将它们的值作为值的字符串散列。

于 2014-12-04T01:34:47.617 回答
0

在更早的 Rails 版本中,namespacing确定helpers哪些controllers视图可以使用助手。

于 2013-07-18T04:34:07.717 回答