我是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
请帮助我,让我知道问题出在哪里。 干杯:)
答案 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进行身份验证。一切都按预期工作。
由于