6

問題

ビューでエラー メッセージ ブロックを再利用しようとしていました。

以下は、positions/_error_messages.html.erb に記述されたブロックです。

<% if @position.errors.any? %>
  <div id="error_explanation">
   <div class="alert alert-error">
     The form contains <%= pluralize(@position.errors.count, "error") %>.
   </div>
   <ul>
    <% @position.errors.full_messages.each do |msg| %>
    <li>* <%= msg %></li>
   <% end %>
   </ul>
 </div>
<% end %>

問題は、@user、@clientなどの異なるオブジェクトで同じコードを繰り返すような、すべてのモデルで同様の部分ビューを作成する必要があることでした.

療法

共有フォルダー shared/_error_messages.html.erb に 1 つの erb を作成し、以下のコードを記述しました。

<% def error_message(active_object) %>
 <% if active_object.errors.any? %>
  <div id="error_explanation">
   <div class="alert alert-error">
    The form contains <%= pluralize(active_object.errors.count, "error") %>.
   </div>
   <ul>
    <% active_object.errors.full_messages.each do |msg| %>
     <li>* <%= msg %></li>
    <% end %>
   </ul>
  </div>
 <% end %>
<% end %>

そしてビューファイルで。positions/new.html.erb 以下のコードを書きました

<div id="errorbox"> 
 <%= render "shared/error_messages" %>
 <%= error_message(@position) %>
</div>

これは、すべての作成操作と更新操作で同じコードを使用できるようになったことを意味します。

知りたいのですが、それは正しい方法ですか?または、他のオプションはありますか?

4

3 に答える 3

8

いいえ、ビューでメソッドを定義するのは正しい方法ではありません。@positionたとえば、最初のパーシャルをより一般的な方法で名前を付けたローカル変数に置き換えてobject、このパーシャルを次のようにレンダリングする必要があると思います。

<%= render 'shared/error_messages', object: @position %>

@positionこれはローカル変数としてobjectパーシャルに渡されます。

于 2013-08-28T10:07:33.817 に答える