我正在关注有关登录的本教程。我暂时跳过了注册章节,因此我正在对用户进行硬编码。我非常小心地遵循了它(现在大约四次),但我仍然遇到会话问题,尤其是 current_user 。
session_helper:
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-z\d\-.]+\.[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,重新启动浏览器,甚至尝试了另一个浏览器,但都是一样的。
问题是,如果我(在 session_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)