Ruby on rails 为什么不';是否为嵌套关联呈现这些错误?

Ruby on rails 为什么不';是否为嵌套关联呈现这些错误?,ruby-on-rails,ruby,forms,ruby-on-rails-4,simple-form,Ruby On Rails,Ruby,Forms,Ruby On Rails 4,Simple Form,我有一个MediaItem模型,它有两个和一个关联。我通过以下方式验证其中一个是否存在: validates_presence_of :photo, allow_nil: true validates_presence_of :video, allow_nil: true validate :photo_or_video_present def photo_or_video_present if !(photo.blank? ^ video.blank?) errors[

我有一个MediaItem模型,它有两个
和一个
关联。我通过以下方式验证其中一个是否存在:

validates_presence_of :photo, allow_nil: true
validates_presence_of :video, allow_nil: true
validate :photo_or_video_present  

 def photo_or_video_present
   if !(photo.blank? ^ video.blank?)
     errors['photo_attributes.image'] << 'Select a photo or a video'
     errors['video_attributes.uid'] << 'Select a photo or a video'
   end
 end
验证是否存在:photo,allow\u nil:true
验证是否存在:视频,允许\u nil:true
验证:照片或视频显示
def照片或视频显示
如果!(photo.blank?^ video.blank?)
错误['photo_attributes.image'][]}>
但是,这些错误不会显示在嵌套模型中。表单如下所示:

<div class="FormWrapper">
  <%= simple_form_for [:admin, @gallery, @media_item], html: { class: "#{action_name.titleize}PhotoForm" } do |f| %>
    <%= f.input :title %>


    <div class="PhotoInputs">
      <h3>Photo</h3>
      <%= f.simple_fields_for :photo do |ff|  %>
        <%= ff.input :image, as: :file_upload, input_html: {preview: @media_item.photo.image} %>
      <% end %>
    </div>

    <div class="VideoInputs">
      <h3>Video</h3>
      <%= f.simple_fields_for :video do |ff|  %>
        <%= ff.input :provider, as: :radio_buttons, collection: Video::PROVIDERS %>
        <%= ff.input :uid %>
      <% end %>
    </div>

    <hr>
    <%= render partial: 'shared/form_submit', locals: {resource: @media_item}  %>
  <% end %>
</div>

照片
视频

为什么这些内联错误无法显示?


注意:表单的功能绝对没有问题。我可以毫无问题地创建和编辑模型和嵌套模型。

这两个验证什么都不做
验证:photo的存在,allow\u nil:true
验证:video的存在,allow\u nil:true
,因为您正在验证存在,但允许它不存在。我只想将
错误
添加到
:base
并在视图中呈现它。e、 g

validates :has_photo_or_video

def has_photo_or_video 
  if (photo.blank? ^ video.blank?)
    errors.add(:base,"Please select a photo or video")
  end
end
然后在视图中

<% f.errors[:base].each do |message| %>
   <span>message</span>
<% end %>
尽管我没有说明这是否有效

您的问题是,它正在寻找将您的错误包含在一个嵌套的散列中,如

{photo_attributes: {image: ["Please select a photo or video"]}, 
 video_attributes: {uid: ["Please select a photo or video"]} }
我看到这一点的唯一方法是在相关模型上进行验证,这在您的案例中是不可能的,因为这是一个一种或两种类型的过程。至少据我所知

如果这是一个非此即彼的或类型的过程,意味着一个
MediaItem
是一个
Photo
a
Video
,但不是两者都是,那么我建议研究多态性,因为它会使这个过程更容易


或者更好的做法是将
MediaItem
全部废弃,并将
title
属性添加到
Photo
Video
中,然后分别创建它们,因为这似乎是最简单的方法。(您仍然可以为
media\u项目定义一个方法
,该方法将获取所有这些内容)

谢谢。对于这个例子,我已经大大简化了MediaItem。它还有很多其他功能,在视频和照片中都可以共享,并且与其他模型的连接方式使得多态性成为一个糟糕的选择。就内联错误而言,Simple form为所有与这些属性相关的MediaItem错误提供了现成的内联错误,所以,当你说你没有看到我描述的内联错误的实现时,你是在专门谈论嵌套模型上的内联错误吗?@Pedr是的,我看到过这样的内联错误实现,但只有在嵌套模型而不是父模型上进行验证时。由于您的设计原因,您无法对嵌套模型执行验证,因此除了基本错误之外,我不确定解决此问题的最佳方法。
def has_photo_or_video 
  if !(photo.blank? ^ video.blank?)
    photo.errors.add(:image,"Please select a photo or video")
    video.errors.add(:uid,"Please select a photo or video")
  end
end
{photo_attributes: {image: ["Please select a photo or video"]}, 
 video_attributes: {uid: ["Please select a photo or video"]} }