0

有类似的问题,但没有一个能够帮助我。我还在学习 rails 并且正在制作一个基本的用户注册系统。在 SessionsHelper 模块的登录方法中,我使用了 self 关键字。

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

    def current_user=(user)
        @current_user = user
    end

    def current_user
        remember_token = User.encrypt(cookies[:remember_token])
        #@current_user ||= User.find_by_remember_token(:remember_token) #The find_by method might not work
        @current_user ||= User.where(remember_token: remember_token).first
    end

    def signed_in?
        !current_user.nil?
    end
end

我将模块包含在 ApplicationController 类中,如下所示:

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper
end

我认为这意味着 SessionsHelper 模块中的关键字 self 因此将始终引用 ApplicationController 类。但是,current_user 不应该实际引用 Sessions_controller 吗?sign_in 方法也在 SessionsController 和 UsersController 中,但是根据我对 self 的理解,当在这些类中调用该方法时,它仍然应该引用 ApplicationController,因为它是包含 SessionsHelper 模块的地方。这是用户控制器的代码:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      flash[:success] = "Welcome to the Sample App"
      redirect_to @user
    else
        render 'new'
    end
  end
end

这是会话控制器:

 class SessionsController < ApplicationController
        def new
        end

        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
 end 

感谢任何能提供帮助的人。几个小时以来,我一直试图理解这一点。

4

1 回答 1

1
   #...snip
   self.current_user = user
end

这里的 self 是该模块已包含的类。所以它执行下一行

def current_user=(user)
    @current_user = user
end

这在控制器上存储了一个实例变量——ApplicationController。通常,所有其他控制器都继承自 ApplicationController,因此这会影响整个系统。

于 2013-09-27T20:24:00.563 回答