Как я могу получить доступ к ошибкам проверки для моих вложенных атрибутов?

<%= form_for @article , :html => {:multipart=> true} do |f| %>
  <% if @article.errors.any? %>
    <ul>
      <% @article.errors.full_messages.each do |msg| %>
       <li><%= msg %></li>
      <% end %>
    </ul>
  <% end %>

Выше приведен фрагмент моей формы, я могу получить доступ к проверкам статей, т.е. validates_presence of:author,:title, однако я не могу получить доступ к проверкам, которые я установил для моих nested_attributes, которые оказались фотографиями. Любые идеи о том, как показать сообщения об ошибках?

2 ответа

Решение

Фото модель:

  Class Photo < ActiveRecord::Base
  belongs_to :article     
  validates :author, presence: true
  end

Модель статьи:

  class Article < ActiveRecord::Base
  has_many :photos
  accepts_nested_attributes_for :photos
  validates_presence_of :author
  end

У нас было это работает раньше

Есть три вещи для рассмотрения:

Все это даст вам возможность контролировать сообщение об ошибке проверки вашей родительской модели или получать к нему доступ. Я думаю, что проблема заключается в том, что, поскольку ваши модели "разъединены", что делает их независимыми - это означает, что их сообщения об ошибках не будут доступны, если вы не сделаете это так.

Вот что я сделаю


Валидаты, связанные

#app/models/article.rb
class Article < ActiveRecord::Base
   has_many :photos
   validates_associated :photos
   accepts_nested_attributes_for :photos
end

Я не использовал это в гневе - это должно сопоставлять сообщения об ошибках от вашей связанной модели, давая вам возможность отображать ошибку через ваш @article объект. Я не уверен, будет ли это работать, но, похоже, это рекомендовано командой разработчиков Rails:

Вы должны использовать этот помощник, когда ваша модель имеет ассоциации с другими моделями, и они также должны быть проверены. Когда вы пытаетесь сохранить свой объект, действительный? будет вызван на каждый из связанных объектов.

-

Отклонить, если

Вы можете использовать reject_if метод на вашем accepts_nested_attributes_for, Это обеспечивает собственное сообщение, но будет только для связанных данных (IE не основан на проверках в вашей дочерней модели):

#app/models/article.rb
class Article < ActiveRecord::Base
   ...
   accepts_nested_attributes_for :photos, reject_if: {|attributes| attributes[:x].blank? } 
end

Также кажется, что вы не получите никаких сообщений с этим! (Я оставлю это, чтобы дать вам возможность)

-

Inverse_Of

Таким способом нам удалось показать ассоциативные сообщения об ошибках. Это в основном дает вашим моделям доступ к данным друг друга, позволяя вам обращаться к ним напрямую:

#app/models/article.rb
class Article < ActiveRecord::Base
   has_many :photos, inverse_of: :article
end

#app/models/photo.rb
class Photo < ActiveRecord::Base
   belongs_to :article, inverse_of :photos
end

Это дает вам возможность вызывать их данные, которые должны заполнить errors объект.

Другие вопросы по тегам