如何访问嵌套属性的验证错误?

时间:2014-09-18 14:23:17

标签: ruby-on-rails nested-attributes nested-form-for

<%= 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:author,:title 但是我无法访问我为我的nested_attributes设置的验证,这些验证恰好是照片。关于如何显示错误消息的任何想法?

2 个答案:

答案 0 :(得分:4)

我们之前已经有了这个工作

有三件事需要考虑:

  

所有这些都使您能够控制或访问来自父模型的验证错误消息。我认为问题在于,当你的模型“解耦”时,使它们独立 - 这意味着它们的错误信息将无法使用,除非你这样做

这就是我要做的事情


验证关联

#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对象。

答案 1 :(得分:1)

照片模特:

  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