0

我在使用 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;如果它是无效的,则会如您所料地引发错误。

4

3 回答 3

2

也许这个问题太老了?

我认为问题出在"new record"旗帜上(正如您所建议的那样)。如果保存了一条新记录,"new record"则设置为 false,很好,但如果有回滚,"new record"则仍将具有值 false,就像保存中的其他填充列将保持其值一样。如果尝试了新的保存(使用正确的值)save,Rails 中的方法将执行 db-update 而不是 db-insert,因为"new record"它是错误的。

我在一个非常旧的 Rails 版本中注意到了这一点,认为它现在会被修复。我在 ActiveRecord::Base 中用这个方法修复了它(Rails 必须在内部仍然使用@new_record 才能工作)

def try_reset_new_record!
  if ! self.new_record? &&
      ( ! self.id || ! self.class.find_by_id(self.id) )
    @new_record = true
  end
end
于 2012-11-19T02:47:56.833 回答
2

ActiveRecord 方法返回 nil 的另一个原因save是它是否被模拟。就像是expect(modelInstance).to receive(:save)

于 2016-09-30T00:45:22.973 回答
0

在我花了一整天的时间之后,这自然是非常简单的事情......

所以它似乎update_attributes只适用于已经保存的记录。

> claim
 => #<Claim id: 51, tnc_accepted_at: nil, status_id: 4>
> claim.valid?
 => true
#=========
> claim.save # This makes all the difference!
   (0.3ms)  BEGIN
  Claim Load (0.4ms)  SELECT --blah blah blah
   (1.0ms)  INSERT INTO "claims" --blah blah blah
   (14.8ms)  COMMIT
 => 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
# ... just as expected.
> claim.update_attributes! :terms_and_conditions => true
   (0.3ms)  BEGIN
  ClaimItem Load (0.8ms)  SELECT --blah blah blah
   (0.8ms)  UPDATE "claims" --blah blah blah
   (11.4ms)  COMMIT
 => true
# ... hooray!
于 2012-08-29T22:30:25.393 回答