2017-02-22 16 views
0

私の見解では、各フォームフィールドの下のフォームのフィールドごとにエラーメッセージを表示したいとします。だからこのようなことをしているIm:括弧のついた検証エラーメッセージ

<% if @event.errors.full_message(:date, @event.errors[:date]) %> 
      <div class="alert alert-danger alert-dismissible fade in" role="alert"> 
       <button type="button" class="close" data-dismiss="alert" aria-label="Fechar"><span aria-hidden="true">×</span></button> 
       <%= @event.errors.full_message(:date, @event.errors[:date]) %> 
      </div> 
     <% end %> 

しかし、メッセージには大括弧と属性の名前が付いています。すべてのエラーメッセージを同時に表示するには、フォーム上部にeachを置いてはいけません。フォーム上の各入力に対してそれぞれのエラーを表示したいと思います。角括弧とメッセージの属性の名前を使わずに、どうすればいいですか?

答えて

1

使用ブラケット[]フィールドに関連するエラーを取得する:あなたのケースでは

<% if @event.errors[:date] %> 
    <div class="alert alert-danger alert-dismissible fade in" role="alert"> 
     <button type="button" class="close" data-dismiss="alert" aria-label="Fechar"><span aria-hidden="true">×</span></button> 
     <%= @event.errors[:date].join('. ') %> 
    </div> 
<% end %> 
+0

これは@Alex Kojinに影響しました。しかし、**。join( '。')**を使用すると、メッセージの大括弧が削除されるのはなぜですか? – churros

+0

'full_messages'メソッドはメッセージの配列を返します。角カッコは、プリントアウトされている配列オブジェクトです。 http://api.rubyonrails.org/classes/ActiveModel/Errors.html#method-i-full_messages – chrismanderson

+0

@churros '@ event.errors [:date]'は配列を返します。 'join'メソッドは配列項目を文字列に結合します。 –

0

@event.errors、あなたは属性のエラーを取得するために[]を使用することができますActiveModel::Errorsのインスタンスであり、 。同じ方法でgetを使用することもできます(例: @event.errors.get(:some_attribute)

@event.errors[:some_attribute]は、渡された属性のエラーの配列を返します。完全なメッセージが必要な場合は、@event.errors.full_messages_for(:some_attribute)を使用すると、配列も返されます。

あなたのビューでは、このような属性のエラーをチェックする必要があります

@event.errors.has_key?(:some_attribute) 

そして、あなたがそれらを一つずつを表示するために、エラーを反復処理する必要があり、次のいずれか

@event.errors[:some_attribute].each do |error| 
    content_tag :span, error, class: 'error' 
end 

かにそれらを結合します単一の文字列または文章:

または最初の/最後の文字を表示してください:

@event.errors[:some_attribute].first 
+0

'@ event.errors.has_key?(:some_attribute)'は ''の場合は<%より優れていますか? – churros

+0

@churrosこれらの作品の1つだけです。 ;)空の配列は真実です。 – coreyward

+0

ありがとう@coreyward! – churros