我在使用 Rails 的save
方法时遇到问题;它似乎在应该失败的时候失败,但在应该失败的时候却没有成功。
我有一个Claim
模型,可以用 any 保存Status
,但如果要提交 ( status_id == 5
),则必须接受条款和条件。
validates :terms_and_conditions, :acceptance => {:accept => true, :if => :submitted?}
def submitted? # simplified for this example
status_id == 5
end
但是,我还存储了条款被接受的时间tnc_accepted_at
(在 db field 下),并定义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;如果它是无效的,则会如您所料地引发错误。