2014-10-28 2 views
1

두 개의 has_one 연관이있는 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 

:

<ActiveModel::Errors:0x007f99c8a71fc0 
    @base=#<MediaItem id: nil, 
        title: "asdadasdasd", 
        slug: "asdadasdasd", 
       gallery_id: 1, 
       created_at: nil, 
       updated_at: nil>, 
    @messages={:"photo_attributes.image"=>["Select a photo or a video"],   
       :"video_attributes.uid"=>["Select a photo or a video"], 
       :title=>[] }> 

그러나 이러한 오류는 중첩 된 모델에 표시되지 않는 나는 하나 또는 다른 사용하고 있는지 확인 . 양식은 다음과 같습니다

<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> 

왜 이러한 인라인 오류를 표시하는 실패?

참고 : 양식의 기능에는 문제가 없습니다. 문제없이 모델과 중첩 모델을 모두 만들고 편집 할 수 있습니다. 당신이 존재를 확인하는하지만이 존재하지 않을 수 있기 때문에

답변

1

이 2 개 검증 아무것도 validates_presence_of :photo, allow_nil: truevalidates_presence_of :video, allow_nil: true을하지 않는다. 그냥 error:base에 추가하고 뷰에 렌더링합니다. 예 : 내가 만들 있지만

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 

: 여러분이이 뭔가를 시도 할 수 있지만, 당신이 설명처럼 인라인 오류의 구현을 보지 못했다

<% f.errors[:base].each do |message| %> 
    <span>message</span> 
<% end %> 

뷰에서 다음

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 

이것이 효과가 있는지 여부에 대한 표현은 없습니다.

문제는 오류가

{photo_attributes: {image: ["Please select a photo or video"]}, 
video_attributes: {uid: ["Please select a photo or video"]} } 

내가이 짓을 본 유일한 방법처럼 중첩 된 해시에 포함하는 것이 가능하지 않은 관련 모델의 유효성을 검사하는 것입니다 찾고 있다는 것입니다 귀하의 case는 하나 또는 두 가지 유형 프로 시저이므로 적어도 나는 그것을 이해한다.

이는 MediaItem가있는 하나 또는 형식 절차를 의미 인 경우 중 하나 Photo또는Video하지만 그때는이 절차가 훨씬 쉽게 만들 것 같은 다형성을 조사 제안했다.

는 또는 더 나은 아직 모두 함께 MediaItem 스크랩 및 PhotoVideotitle 속성을 추가하고이 가장 쉬운 것 같아로 다음 개별적으로 각을 만듭니다. (당신은 여전히 ​​media_items에 대해이 모든 것을 얻을 수있는 방법을 정의 할 수 있습니다)

+0

고마워. 이 예제에서는 MediaItem을 크게 단순화했습니다. 비디오와 사진 모두에서 공유되는 다른 많은 기능을 가지고 있으며 다형성을 좋지 않게 만드는 방식으로 다른 모델과 연결됩니다. 인라인 오류가 발생하는 한 Simple 양식을 사용하면 해당 속성과 관련된 모든 MediaItem 오류에 대한 인라인 오류가 즉시 제공되므로 인라인 오류 구현을 보지 못했다고 할 때 구체적으로 설명합니다. 중첩 모델에 대한 인라인 오류에 대해 이야기하고 있습니까? – Undistraction

+1

@Pedr 예이 구현 된 인라인 오류는 부모가 아닌 중첩 모델에서 유효성 검사가 수행 된 경우에만 발생했습니다. 디자인 때문에 중첩 모델에 대한 유효성 검사를 수행 할 수 없기 때문에 기본 오류 이외의 다른 방법에 대한 최선의 방법은 확실하지 않습니다. – engineersmnky

관련 문제