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

Koh*_*ohl 1 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 %>
Run Code Online (Sandbox Code Playgroud)

上面是我的表单的一个片段,我可以访问文章的验证,即:author, :title 的validates_presence 但是我无法访问我为nested_attributes 设置的验证,这些验证恰好是照片。关于如何显示错误消息的任何想法?

Ric*_*eck 6

我们以前有过这个工作

有以下三点需要考虑:

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

这就是我要做的


验证关联

#app/models/article.rb
class Article < ActiveRecord::Base
   has_many :photos
   validates_associated :photos
   accepts_nested_attributes_for :photos
end
Run Code Online (Sandbox Code Playgroud)

我没有愤怒地使用它 - 它应该整理来自关联模型的错误消息,使您能够通过@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
Run Code Online (Sandbox Code Playgroud)

似乎您也不会收到任何消息!(我会把它留在里面给你一个选择)

——

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
Run Code Online (Sandbox Code Playgroud)

这使您能够调用填充errors对象的数据。