Ruby on rails 3 Rails记住\u令牌会话不工作
我是RubyonRails新手。我是通过Michel Hartl在互联网上的参考文件来学习的。然而,我在用户登录期间遇到了一个问题,我怀疑before_save没有调用create_memory_令牌方法。我一直在尝试调试这个问题。我的代码如下: user.rb文件:Ruby on rails 3 Rails记住\u令牌会话不工作,ruby-on-rails-3,Ruby On Rails 3,我是RubyonRails新手。我是通过Michel Hartl在互联网上的参考文件来学习的。然而,我在用户登录期间遇到了一个问题,我怀疑before_save没有调用create_memory_令牌方法。我一直在尝试调试这个问题。我的代码如下: user.rb文件: # == Schema Information # # Table name: users # # id :integer(4) not null, primary key # name
# == 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
会话\u 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
class sessioncontroller
请帮助我,让我知道问题存在的地方。
干杯:)只有在创建用户时(即在用户注册时,而不是在用户登录时)才应调用before_save回调。您没有在代码示例中显示整个注册/用户创建流程,但我假设它存在 通过从Rails控制台运行以下命令,可以测试是否调用了create_MEMORE_token(在创建用户时):
User._save_callbacks.select { |cb| cb.kind.eql?(:before) }.collect(&:filter).include?(:create_remember_token)
当且仅当create_memory_token函数在save上运行时,应返回true。更多详细信息,请参阅的“调试回调”部分
如果在注册流期间调用了回调,则应该将membere_令牌保存到数据库中。您可以通过使用Rails控制台(user.last,在创建测试用户之后)检查用户来验证这一点
您的注册/用户创建流程是什么样的?什么复制步骤会导致您描述的问题?您在登录过程中遇到的问题到底是什么 我询问的原因是,在登录过程中不应该调用create_memory_token方法。当用户被保存(注册)时会调用它 登录过程只是从用户表中获取令牌并将其复制到永久cookie中。登录过程大致如下所示:
登录用户-->session\u helper.rb-->def登录(用户)-->cookies.permanent[:memory\u token]=user.memory\u token-->返回session\u controller.rb-->重定向到…布局中可能没有使用csrf元标记。尝试删除控制器文件夹中应用程序_controller.rb中的“防止伪造”。然后再次尝试运行该应用程序,如果它有效,那么您没有在布局中添加标签。我一年前就发布了这个问题。 现在我使用gem进行身份验证。一切正常
谢谢user_controller.rb:class users controller
User._save_callbacks.select { |cb| cb.kind.eql?(:before) }.collect(&:filter).include?(:create_remember_token)