0

我正在关注有关登录的本教程。我暂时跳过了注册章节,因此我正在对用户进行硬编码。我非常小心地遵循了它(现在大约四次),但我仍然遇到会话问题,尤其是 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)
4

1 回答 1

0

问题终于解决了,这是通过删除数据库中的所有(测试)用户并创建新用户(带有种子)来完成的。

用户是在将更改应用于应用程序和数据库模型之前创建的,这可能会导致问题。

于 2013-02-06T23:28:37.497 回答