我正在研究Rails 3中的一个项目,我需要创建一个空记录,将其保存到数据库而不进行验证(因为它是空的),然后允许用户编辑此记录以完成它,并从此开始验证。
现在我遇到了一个非常基本的问题:在任何情况下我都无法保存模型。
我在控制台中尝试了以下内容:
model = Model.new
model.save(false) # Returns RuntimeError: Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
model.save( :validate => false ) # Returns same error as above
model = Model.create
model.save(false) # Same runtime error
model.save( :validate => false ) # Same runtime error
然后我尝试将模型中的所有验证更改为:on => :update
。任何保存尝试都会出现相同的错误消息。
那我在这里错过了什么?如何创建空记录,然后在用户编辑时进行验证?
谢谢!
答案 0 :(得分:23)
通过正常用例保存无效模型是一种不好的做法。改为使用条件验证:
validates_presence_of :title, :unless => :in_first_stage?
或者如果你有很多:
with_options :unless => :in_first_stage? do
validates_presence_of :title
validates_presence_of :author
end
这样就没有任何方法可以进行夜间完整性测试,它会检查所有记录的有效性。
用于保存而不进行验证的有效用例将用于测试边缘情况,例如测试是否强制执行数据库约束。
答案 1 :(得分:14)
*叹... *
发现问题...我的一个after_validate方法调用是添加信息并重新保存模型,因此我得到的错误不是来自控制台输入,它们来自after_validate方法,它再次保存。< / p>
谢谢大家。
答案 2 :(得分:3)
假设您已经仔细考虑过并且确定这是一个好主意,您可以使用以下方式保存而无需验证:
my_model.save validate: false
对此几乎没有有效的用例,应该将其视为紧急一次性程序。您的用例不符合条件。
数据库中包含无效记录会导致各种问题。例如,您向所有用户发送电子邮件并更新&#39; last_contacted_at&#39;用户模型上的字段。您的无效用户将不会更新,并将进入死亡的电子邮件。
正如其他海报所指出的那样,条件验证将解决您可能使用的大多数问题:false。
答案 3 :(得分:1)
不是在数据库中放置无效模型,而是存储部分完成的模型(使用Model.new
创建)in a session。只有在数据库完全有效时才将其保存到数据库中。