1
<%= 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 %>

上記は私のフォームのスニペットです。記事の検証、つまり:author、:titleのvalidates_presenceにアクセスできますが、たまたま写真であるnested_attributesに設定した検証にアクセスできません。エラーメッセージを表示する方法についてのアイデアはありますか?

4

2 に答える 2

6

これは以前に機能していました

考慮すべき点が 3 つあります。

これらはすべて、親モデルからの検証エラー メッセージを制御またはアクセスする機能を提供します。問題は、モデルが「分離」されて独立しているため、そうしない限りエラーメッセージが表示されないことだと思います

これが私がすることです


関連付けられていることを検証します

#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ます。

于 2014-09-18T17:52:25.317 に答える