如何验证rails 4中的嵌套属性字段?

时间:2014-03-18 05:37:49

标签: ruby-on-rails validation ruby-on-rails-4 nested-attributes

我有两个型号

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

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

2 个答案:

答案 0 :(得分:4)

您可以像往常一样在所需的模型中编写验证。因此,如果您需要在foo课程中验证字段Information的存在,那么您只需在该课程中编写validates_presence_of :foo。同样,Study字段的验证只会进入Study类。使用嵌套属性时,当您从包含嵌套属性的Study哈希更新params实例时,它也会更新Information实例,并在传递中运行验证。这就是accepts_nested_attributes_for电话正在做的事情 - 它正在给予&#34;许可&#34;以这种方式使用params哈希的适当位。

如果符合条件,您可以使用reject_if仅拒绝嵌套记录。因此,我可以让某人创建一个研究,并且只创建一个或多个与该研究相关联的嵌套信息实例,如果他们填写表单中的字段,但如果他们将它们留空,则嵌套的东西不会#39 ;创建和保存(这样你就不会得到毫无意义的空白关联记录)。该研究仍将得到保存。例如:

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

此处的API文档中包含了以下内容:

请注意,嵌套字段仅适用于现有记录。如果您在new / create操作中创建了一个 new Study实例而没有关联的信息实例,那么您将无法看到Information类的任何嵌套表单字段一点 - 当你可能只期待一个时,一个空白的新项目。如果您还没准备好,这可能会非常混乱!您需要手动将新Information个实例添加到控制器中的Study个实例或类似的新版本{&1;}。并且&#39;创造&#39;行动,例如使用before_filter :create_blank_object, only: [ :new, :create ],比如说:

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

答案 1 :(得分:-1)

您可以使用rails中提供的validates_presence验证,否则您可以编写before_createbefore_save callback方法。在validation logicbefore_create回调方法中写下before_save