仅当主对象需要其存在时才验证嵌套对象

时间:2012-08-23 20:48:40

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

这是我的模型层次结构:

  • Page
    • has_many:媒体(媒体可以是TextMediumImageMediumVideoMedium ...(STI))
      • 每个媒体has_one:attachment(ImageAttachmentVideoAttachment ...(不同的表))

我想要一个表单来创建一个页面:

  • ImageMedium(不是必需的)
  • a VideoMedium(不是必需的)
  • 其他属性......

ImageMedium验证其附件的存在。 VideoMedium也是如此。

但该页面未验证是否存在ImageMediumVideoMedium媒体。


我的表单看起来像这样(“伪代码”):

form_for page
     fields_for :image_media
         fields_for :attachement
             image_field
     fields_for :video_media
         fields_for :attachement
             video_field

问题

  • 如果我完全填写表单,它会很有效,我可以使用其媒体和附件创建页面。

  • 但是如果我没有填写视频字段,我仍然希望创建我的页面(因为页面不需要视频媒体)。但它不会,因为视频媒体需要附件的存在,所以它无效,所以页面无效......

问题

如何忽略视频媒体验证失败并仍然创建页面的事实?


修改

我找到了答案:

class Page < ActiveRecord::Base
    accepts_nested_attributes_for :video_media, reject_if: ->(attributes) { attributes["attachment_attributes"]["video"].blank? }
end

如果你有更好的,请分享。

1 个答案:

答案 0 :(得分:0)

我找到了答案:

class Page < ActiveRecord::Base
    accepts_nested_attributes_for :video_media, reject_if: ->(attributes) { attributes["attachment_attributes"]["video"].blank? }
end

如果你有更好的,请分享。