Как я могу получить доступ к ошибкам проверки для моих вложенных атрибутов?
<%= 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
объект.