如何validationrails 4中的嵌套属性字段?

我有两个型号

class Information < ActiveRecord::Base belongs_to :study validates_presence_of :email end 

 class Study < ActiveRecord::Base has_many :informations accepts_nested_attributes_for :informations end 

我展示了一种研究forms,其中包含很少的信息字段,我想validation这些字段的存在。 只有在validation成功时我才想保存研究字段值,并且我想在validation失败时显示错误。 我怎样才能做到这一点? 提前致谢。

您可以像往常一样在所需的模型中编写validation。 因此,如果您需要在Information类中validation字段foo存在,那么您只需在该类中编写validates_presence_of :foo 。 同样, Study字段的validation只需进入Study类。 使用嵌套属性时,从包含嵌套属性的params哈希更新Study实例时,它也会更新Information实例,并在传递中运行validation。 这就是accepts_nested_attributes_for调用正在做的事情 – 它为这样使用的params散列的适当位赋予“权限”。

如果不符合条件,您可以使用reject_if仅拒绝新的嵌套记录。 所以我可能会让某人创建一个Study并且只创建一个或多个与该Study相关联的嵌套Information实例,如果他们填写了表单中的字段,但是如果他们将它们留空,则不会创建嵌套的东西并保存(所以你没有得到毫无意义的空白相关记录)。 该研究仍将得到保存。 例如:

 accepts_nested_attributes_for( :informations, reject_if: proc() { | attrs | attrs[ 'title' ] .blank? } ) 

这里有更多内容,这里有API文档:

请注意,嵌套字段仅适用于现有记录 。 如果您在没有关联信息实例的new / create操作中创建新的 Study实例,则根本不会看到任何信息类的嵌套表单字段 – 当您可能只需要一个空白新项目时。 如果您还没准备好,这可能会非常混乱! 您需要手动将新的Information实例添加到控制器中的Study实例或类似的’new’和’create’操作,例如使用before_filter :create_blank_object, only: [ :new, :create ] ,with,say :

 def create_blank_object @study = Study.new @study.informations << Information.new end 

您可以使用rails中可用的validates_presencevalidation,您可以编写before_createbefore_save callback方法。 在before_createbefore_save回调方法中写入validation logic

查看有关validates_associated的API文档:

validation关联的对象是否全部有效。 适用于任何类型的协会。

如果在运行validation的父对象上调用方法(例如save),则也会调用关联对象的validation。