我有两个型号
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
我展示了一种研究形式,其中包含很少的信息字段,我想验证这些字段的存在。只有在验证成功时我才想保存研究字段值,并且我想在验证失败时显示错误。我怎样才能做到这一点?提前谢谢。
答案 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_create
或before_save callback
方法。在validation logic
或before_create
回调方法中写下before_save
。