我正在使用一个包含总共 7 个模型的嵌套表单,每个模型都有不同的验证。简单地编辑表单时,验证运行并显示正常,并且数据被正确保存。但是,我需要根据提交表单的人员运行不同的验证(即,管理员可以跳过一些原本需要的字段)。
我想我可以通过在我的模型中使用 attr_accessible :editing_user 来跳过某些验证,然后在控制器中设置它。
class ModelExample < ActiveRecord::Base
attr_accessible :editing_user
validates_presence_of :email, :unless => "editing_user == 'admin'"
end
class ModelExamplesController < ActionController::Base
def create
@model_example = ModelExample.new(params[:model_example])
@model_example.editing_user = 'admin'
@model_example.save
end
end
我在嵌套模型中使用了这个基本结构,检查是否可以正确保存。这就是奇怪行为开始的地方。出于某种原因,ActiveRecord 似乎试图多次保存嵌套模型,每次都运行验证。奇怪的是我调用了@model_example.save,如果失败,它应该只返回false。但是,第一次验证通过(因为设置了 editing_user),但后来的验证失败并引发异常,因此正常的 .save 方法最终引发异常而不是返回。
有谁知道如何避免让 ActiveRecord 进行所有额外的验证和保存,或者如何在这些重复的操作中保留 editor_user?