我正在学习关于登录的教程。我暂时跳过了注册章节,所以我对用户进行硬编码。我已经非常小心地遵循了它(现在大约四次),但我仍然在会话中遇到问题,尤其是current_user。
会话助手:
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
def signed_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
def sign_out
self.current_user = nil
cookies.delete(:remember_token)
end
end
会话控制器:
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by_email(params[:session][:email])
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to user
else
flash.now[:error] = 'Invalid email/password combination' # Not quite right!
render 'new'
end
end
def destroy
sign_out
redirect_to root_url
end
end
用户模型:
class User < ActiveRecord::Base
attr_accessible :first_name, :last_name, :email, :password
has_secure_password
before_save :create_remember_token
has_and_belongs_to_many :projects
belongs_to :project
belongs_to :ticket
validates :first_name, presence: true, length: { maximum: 24 }
validates :last_name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /A[w+-.]+@[a-zd-.]+.[a-z]+z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }
validates :password, presence: true, length: { minimum: 6 }
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
示例:
<% if signed_in? %>
<li><%= link_to "Create projekt", :controller => "projects", :action => "new" %>
<% end %>
当我运行我的应用程序时,它会显示我已登录(所有只应为登录用户显示的内容都会显示出来,反之亦然)。我尝试过清除cookie,重新启动浏览器,甚至尝试过其他浏览器,但都是一样的。
问题是,如果我(在sessions_helper.rb中)从:更改
def signed_in?
!current_user.nil?
end
到。。。
def signed_in?
current_user.nil?
end
即删除"!",登录/注销即可工作,并显示正确的链接。但这也意味着我不能使用current_user,因为它实际上是"nil"。
所以问题是为什么current_user为零?代码出了什么问题?
这是用户的数据库模型:
first_name | varchar(25)
last_name | varchar(50)
email | varchar(255)
created_at | datetime
updated_at | datetime
password_digest | varchar(255)
password | varchar(255)
remember_token | varchar(255)
问题最终得到了解决,删除了数据库中的所有(测试)用户并创建了新用户(带有种子)。
用户是在应用程序和数据库模型应用更改之前创建的,这可能导致了问题。