self是否引用ApplicationController,UsersController或SessionsController?

时间:2013-09-27 20:10:42

标签: ruby-on-rails module session-variables helper self

有类似的问题,但没有人能够帮助我。我还在学习rails并且正在建立一个基本的用户注册系统。在SessionsHelper模块的signin方法中,我使用了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模块的地方。以下是UsersController的代码:

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

这是SessionsController:

 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 

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

1 个答案:

答案 0 :(得分:1)

   #...snip
   self.current_user = user
end

此处的self是此模块已包含在的类中。所以它执行下一行

def current_user=(user)
    @current_user = user
end

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