手动失败#update_attributes保存在Rails中

时间:2017-06-02 20:23:30

标签: ruby-on-rails activerecord error-handling

我正在调用@foo.update并在其正在更新的1个属性中,我在def attribute=的模型类中调用了write方法(foo)并希望它有条件地使整个更新失败。我可以放在那里?我尝试使用errors[:base],但save没有失败。我无法使用validates因为该属性在保存之前会被转换为其他内容。

  def attribute=(attr)
    if bar
      # code to fail entire db save
    end
  end

2 个答案:

答案 0 :(得分:1)

您只需检查模型before_savefoo.rb回调的条件,如果您不想保存,则返回false。

before_save :really_want_to_save?

private

def really_want_to_save?
  conditional_says_yes ? true : false
end

如果您也想要错误消息,那么

def really_want_to_save?
  if conditional_says_yes
    true
  else
    errors[:base] << "failed"
    false
  end
end

答案 1 :(得分:0)

如果你想在setter中中止,那么提出异常就足够了。

  def attribute=(attr)
    if bar
      raise "Couldn't save because blah blah"
    end
  end

但是,如其他帖子所述,在保存之前进行此检查可能更好。这就是验证的目的。

validate :my_condition

def my_condition
  if bar
    errors.add(:base, "Couldn't save because blah blah")
  end
end