无法在Rails 3中跳过验证?

时间:2011-01-14 18:39:41

标签: ruby-on-rails validation ruby-on-rails-3 model runtime-error

我正在研究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。任何保存尝试都会出现相同的错误消息。

那我在这里错过了什么?如何创建空记录,然后在用户编辑时进行验证?

谢谢!

4 个答案:

答案 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。只有在数据库完全有效时才将其保存到数据库中。