【发布时间】:2014-01-20 22:26:24
【问题描述】:
我正在尝试完成 rails 教程,但遇到了问题。 在调试它的过程中,我遇到了这种奇怪的行为,我认为这与我的问题有关。
>rails console
DL is deprecated, please use Fiddle
Loading development environment (Rails 3.2.16)
irb(main):001:0> app.cookies['foo'] = 'bar'
=> "bar"
irb(main):002:0> app.cookies['remember_token'] = 'foobar'
=> "foobar"
irb(main):003:0> app.cookies['foo']
=> "bar"
irb(main):004:0> app.cookies['remember_token']
=> "foobar"
irb(main):005:0> app.put app.root_url
User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" IS NULL LIMIT 1
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" IS NULL LIMIT 1
=> 200
irb(main):006:0> app.cookies['foo']
=> "bar"
irb(main):007:0> app.cookies['remember_token']
=> ""
注意 cookies['foo'] 在 put 后如何保持设置为 'bar',但 cookies['remember_token'] 设置为 ""
谁能解释一下这里可能发生了什么? 我在模型中有一个“remember_token”列,但我不知道它应该如何发挥作用。
这是模型:
class User < ActiveRecord::Base
attr_accessible :email, :name, :password, :password_confirmation
has_secure_password
validates :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 },
uniqueness: { case_sensitive: false }
validates :password, presence: true,
length: { minimum: 6 }
validates :password_confirmation, presence: true
before_save { email.downcase! }
before_save :create_remember_token
private
def create_remember_token
puts "in create remember_token" #added for debug
self.remember_token = SecureRandom.urlsafe_base64
puts remember_token #added for debug
end
end
这里是数据库:
ActiveRecord::Schema.define(:version => 20140111165943) do
create_table "users", :force => true do |t|
t.string "name"
t.string "email"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.string "password_digest"
t.string "remember_token"
end
add_index "users", ["email"], :name => "index_users_on_email", :unique => true
add_index "users", ["remember_token"], :name => "index_users_on_remember_token"
end
我最初的问题与测试失败有关,可以找到here
更新:找到这种奇怪行为的根源
当我开始收集代码以显示完整的控制器时(按照评论中的要求),很明显这将成为我的问题的根源。
class ApplicationController < ActionController::Base
protect_from_forgery
include SessionsHelper
# Force signout to prevent CSRF attacks
def handle_unverified_request
sign_out
super
end
end
这里是 sign_out 方法(在我的 session_helper 中)
def sign_out
puts "in sign out"
cookies.delete :remember_token
self.current_user = nil
end
我在 sign_out 方法中添加了一个 puts,并看到它在执行 put(但不是 get)后立即被调用。现在我必须回到教程,看看我一定做错了什么。
【问题讨论】:
-
请显示完整的控制器,包括登录方法
-
@BillyChan 谢谢,我只需要这个请求就能搞清楚。我做的第一件事是打开 ApplicationController 并找到上面的代码(在我的问题中更新)
-
nPn,很高兴你自己想出来了!控制器是进行此类更改的唯一可能位置。
标签: ruby-on-rails cookies