0

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

用户.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

session_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

4 回答 4

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。回调 API 文档的“调试回调”部分中的更多详细信息。

如果在注册流程中调用回调,那么 remember_token 应该保存到数据库中。您可以通过使用 Rails 控制台检查用户来验证这一点(User.last,在创建测试用户之后)。

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

于 2012-05-10T19:05:09.243 回答
1

您在登录期间遇到的具体问题是什么?

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

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

登录用户 --> session_helper.rb --> def sign_in(user) --> cookies.permanent[:remember_token] = user.remember_token --> 返回 session_controller.rb --> redirect_to ...

于 2012-05-10T20:18:13.020 回答
0

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

谢谢

于 2013-07-08T05:40:04.383 回答
0

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

于 2013-07-07T18:28:12.850 回答