Rails remember_token会话无法正常工作

时间:2012-05-10 17:34:50

标签: ruby-on-rails-3

我是Ruby on Rails的新手。我是通过互联网上提供的Michel Hartl的参考文档来学习的。但是在登录用户时我遇到了问题,我怀疑before_save没有调用create_remember_token方法。我试图在很长一段时间内调试这个问题。我的代码如下:

user.rb文件:

# == Schema Information
#
# Table name: users
#
#  id              :integer(4)      not null, primary key
#  name            :string(255)
#  email           :string(255)
#  created_at      :datetime        not null
#  updated_at      :datetime        not null
#  password_digest :string(255)
#  username        :string(255)
#  remember_token  :string(255)
#

class User < ActiveRecord::Base
def to_param
username
end
attr_accessible :name, :email, :password, :password_confirmation, :username
has_secure_password


before_save { |user| user.email = email.downcase }
before_save :create_remember_token

private

def create_remember_token
 self.remember_token = SecureRandom.urlsafe_base64
end
end

session_helper.rb

module SessionsHelper

def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
current_user = user
end

def current_user=(user)
  @current_user = user
end

def current_user
 @current_user ||= user_from_remember_token
end

def signed_in?
 !current_user.nil?
end

private

def user_from_remember_token
  remember_token = cookies[:remember_token]
  User.find_by_remember_token(remember_token) unless remember_token.nil?
end   
end

sessions_controller.rb:

class SessionsController < ApplicationController
def new

end

def create
    user=User.find_by_username(params[:session][:username])
    if user && user.authenticate(params[:session][:password])
        sign_in user
        redirect_to "/@/#{params[:session][:username]}"
    else
        flash.now[:error] = "Login failed! Please try again!"
        render 'new'
    end
end

def destroy

end
end

请帮助我,让我知道问题出在哪里。 干杯:)

4 个答案:

答案 0 :(得分:1)

只有在创建用户时(即他们注册时,而不是他们登录时)才会调用before_save回调。您没有在代码示例中显示整个注册/用户创建流程,但我认为它存在。

您可以通过从Rails控制台运行此命令来测试是否已调用create_remember_token(创建用户时):

User._save_callbacks.select { |cb| cb.kind.eql?(:before) }.collect(&:filter).include?(:create_remember_token)

当且仅当在保存时运行create_remember_token函数时,才应该返回true。有关详细信息,请参阅Callbacks API Documentation的“调试回调”部分。

如果在注册流程期间调用回调,则应将remember_token保存到DB。您可以通过使用Rails控制台(User.last,创建测试用户后)检查用户来验证这一点。

您的注册/用户创建流程是什么样的?什么重复步骤会产生你所描述的问题?

答案 1 :(得分:1)

登录时遇到的问题究竟是什么?

我问的原因是在登录过程中不应该调用create_remember_token方法。保存用户(注册)时会调用它。

登录过程只是从users表中提取令牌并将其复制到永久cookie中。登录过程大致如下:

sign_in user - &gt; session_helper.rb - &gt; def sign_in(用户) - &gt; cookies.permanent [:remember_token] = user.remember_token - &gt;回到session_controller.rb - &gt; redirect_to ...

答案 2 :(得分:0)

您可能没有在布局中使用过csrf元标记。尝试删除controllers文件夹中application_controller.rb中的“防止伪造”。然后尝试再次运行应用程序,如果它工作,那么你没有添加标签到你的布局。

答案 3 :(得分:0)

我在一年前发布过这个问题。 现在我使用Devise gem进行身份验证。一切都按预期工作。

由于