Rails のsave
方法に問題があります。あるべきときに失敗しているように見えますが、あるべきときに成功していません。
Claim
任意の で保存できるモデルがありますがStatus
、それを送信する場合 ( status_id == 5
)、利用規約に同意する必要があります。
validates :terms_and_conditions, :acceptance => {:accept => true, :if => :submitted?}
def submitted? # simplified for this example
status_id == 5
end
ただし、条件が受け入れられた時刻も ( db フィールドの下に) 保存し、このフィールドの存在としてtnc_accepted_at
定義しています。terms_and_conditions
(このビットは正常に動作しますが、それが私の問題に関連しているかどうかはわかりません。)
def terms_and_conditions
tnc_accepted_at.present?
end
def terms_and_conditions=(bool) # browser will pass '0' or '1'
self.tnc_accepted_at = bool.in?([false, nil, 0, '', '0']) ? nil : DateTime.now
end
しかし、ここに問題があります。クレームは次の状態から始まります。
claim
=> #<Claim id: 51, tnc_accepted_at: nil, status_id: 4>
claim.valid?
=> true
それから私はそれを提出しようとします:
claim.update_attributes! :status_id => 5
(0.3ms) BEGIN
ClaimItem Load (1.5ms) SELECT --blah blah blah
Status Load (0.6ms) SELECT --blah blah blah
(0.4ms) ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Terms and conditions must be accepted
...これは完璧ですが、エラーを修正しようとすると:
claim.update_attributes! :terms_and_conditions => true
(0.3ms) BEGIN
ClaimItem Load (1.1ms) SELECT --blah blah blah
(0.7ms) UPDATE "claims" --blah blah blah
(0.2ms) ROLLBACK
=> nil
...それはただ奇妙です! そして、レコードを保存しようとすると、どのような状況でも ( save
, save!
, update_attributes
,update_attributes!
を使用:tnc_accepted_at => DateTime.now
しても問題ありません) 、有効な場合はロールバックして nil を返します。invalidの場合、期待どおりにエラーが発生します。