我正在调用@foo.update
并在其正在更新的1个属性中,我在def attribute=
的模型类中调用了write方法(foo
)并希望它有条件地使整个更新失败。我可以放在那里?我尝试使用errors[:base]
,但save
没有失败。我无法使用validates
因为该属性在保存之前会被转换为其他内容。
def attribute=(attr)
if bar
# code to fail entire db save
end
end
答案 0 :(得分:1)
您只需检查模型before_save
中foo.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