0

モデルRecoverable用のモジュールがあります。認証方式を採用したモデル。モデルは次のとおりです。CustomerCustomerhas_secureCustomer

class Customer < ActiveRecord::Base
  include Recoverable

  ##
  # Validations
  validates :email, format: { with: REGEX_EMAIL }, allow_nil: false, allow_blank: false
  validates_uniqueness_of :email
  validates_presence_of :email


  has_secure_password

  validates :password, length: { minimum: 6 }, if: :password_digest_changed?
  validates :password_confirmation, presence: true, if: :password_digest_changed?

end

そして、ここにRecoverableモジュールがあります:

# encoding: utf-8

module Recoverable
  extend ActiveSupport::Concern

  def reset_password!(new_password, new_password_confirmation)
    self.password = new_password
    self.password_confirmation = new_password_confirmation
    if valid?
      self.reset_password_token = nil
      self.reset_password_sent_at = nil
    end
    save
  end
end

私の問題は、reset_password呼び出された後、 nullreset_password_tokenではないことです。reset_password_sent_atnull に設定されていません。列の下に更新クエリが設定されていません。なんで?私は何かが恋しいですか?さらに情報が必要な場合はお知らせください。

私の環境: Rails 4 アプリを使用しています。

UPDATE 1 self.inspect を置くと、次の出力が得られます。

#<Customer id: 79, email: "milk@yahoo.com", password_digest: "$2a$10$U2knjpm5LF1V/sgXag0DcOpgZWHSpLw8nfCy4U8D57s6...", created_at: "2013-05-11 11:55:34", updated_at: "2013-05-16 10:04:45", reset_password_sent_at: nil, reset_password_token: nil>

更新 2:

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"PbUhgSPvQZWXflT5fA1WhqhHJX3c7NMapg6eeDQvpBI=", "token"=>"fiMXi2_4cYCHsFMop9TJBL2Qeqc41xWhHA", "q"=>{"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}}
Unpermitted parameters: utf8, _method, authenticity_token, q
  Customer Load (0.4ms)  SELECT "customers".* FROM "customers" WHERE "customers"."reset_password_token" IS NULL LIMIT 1
Unpermitted parameters: password_confirmation
Unpermitted parameters: password
  Customer Exists (0.3ms)  SELECT 1 AS one FROM "customers" WHERE ("customers"."email" = 'milk@yahoo.com' AND "customers"."id" != 79) LIMIT 1
----------------------------BEFORE: 
#<ActiveModel::Errors:0xb593c280 @base=#<Customer id: 79, email: "milk@yahoo.com", password_digest: "$2a$10$/xYeks8yyaCMOFORFLMb1.xR7fxfskW6kHR4S2df/LTK...", store_id: 124, created_at: "2013-05-11 11:55:34", updated_at: "2013-05-16 11:56:52", reset_password_sent_at: nil, reset_password_token: nil>, @messages={}>
   (0.1ms)  BEGIN
  CACHE (0.0ms)  SELECT 1 AS one FROM "customers" WHERE ("customers"."email" = 'milk@yahoo.com' AND "customers"."id" != 79) LIMIT 1
  SQL (0.3ms)  UPDATE "customers" SET "password_digest" = $1, "updated_at" = $2 WHERE "customers"."id" = 79  [["password_digest", "$2a$10$/xYeks8yyaCMOFORFLMb1.xR7fxfskW6kHR4S2df/LTKUI001xu0O"], ["updated_at", Thu, 16 May 2013 19:58:25 ULAT +08:00]]
   (16.5ms)  COMMIT
---------------------------- SAVE: 
true
----------------------------AFTER: 
#<ActiveModel::Errors:0xb593c280 @base=#<Customer id: 79, email: "milk@yahoo.com", password_digest: "$2a$10$/xYeks8yyaCMOFORFLMb1.xR7fxfskW6kHR4S2df/LTK...", store_id: 124, created_at: "2013-05-11 11:55:34", updated_at: "2013-05-16 11:58:25", reset_password_sent_at: nil, reset_password_token: nil>, @messages={}>
4

2 に答える 2

1

最後に、変数をクリアした後にモデルが有効でない場合は、次のようにします。

save(validate: false)

検証をスキップし、無効なモデルを保存できるようにします

于 2013-05-16T12:04:09.503 に答える
0

モデルが本当に有効かどうかを確認できますか? 私は次のようなことを意味します

if valid? 
  puts "valid"
  self.reset_password_token = nil
  self.reset_password_sent_at = nil
else
  puts self.errors.inspect
end

たぶん、いくつかの検証を忘れていて、そのブロックに行きませんか?

于 2013-05-16T10:32:50.343 に答える