通常,您想在控制器中使用非爆炸版本。这允许这样的逻辑:
def update
@model = Model.find params[:id]
if @model.update_attributes params[:model]
else
end
end
当我想确定自己是否知道某些内容未通过验证且未保存时,在测试中经常使用爆炸式版本。我肯定浪费了时间,因为更改了模型验证而导致调试失败,如果使用bang版本,这将是显而易见的。
例如
it "should do something" do
m = Model.create! :foo => 'bar'
m.should do_something
end
就数据库中没有无效数据而言,您应该使用ActiveRecord验证(例如validates_presence_of :user_id
)来处理此问题,或者validate
在模型中定义自己的方法。(http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html)如果您的数据无效,这应该可以防止保存。如果您真的很偏执,可以向数据库添加一些约束。检查ActiveRecord::Migration
文档,了解如何在迁移中设置唯一索引和其他数据库约束。
同样,根据我的经验,您希望尽可能避免使用任何自定义保存或创建方法。如果您重新实现ActiveRecord中包含的功能,您最终将付出一定的代价。 http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist还有更多要说的。