有类似的问题,但没有一个能够帮助我。我还在学习 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
感谢任何能提供帮助的人。几个小时以来,我一直试图理解这一点。