有类似的问题,但没有人能够帮助我。我还在学习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
感谢任何可以提供帮助的人。我一直试图理解这几个小时。
答案 0 :(得分:1)
#...snip
self.current_user = user
end
此处的self是此模块已包含在的类中。所以它执行下一行
def current_user=(user)
@current_user = user
end
这将在控制器上存储一个实例变量--ApplicationController。通常,所有其他控制器都继承自ApplicationController,因此这会影响整个系统。