2016-08-04 15 views
0

私は助けが必要な奇妙な問題があります。デフォルトの検証方法からエラーメッセージをカスタマイズするrails

だから私は、少なくとも1つを選択する必要があるように私のフォームのチェックボックスを検証しようとしている:

... 
<div class="form-group"> 
    <%= f.collection_check_boxes(:topping_ids, Topping.all, :id, :name, include_hidden: false) do |b| %> 
    <ul> 
     <li><%= b.check_box %> - <%= b.label %></li> 
    </ul> 
</div> 
... 

マイモデル:

class Pizza < ApplicationRecord 
    has_many :pizza_toppings, dependent: :destroy 
    has_many :toppings, through: :pizza_toppings 

    validates_presence_of :name 
    validates_length_of :topping_ids, minimum: 1, message: "You must select at least 1 topping" 
end 

マイエラー部分:

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

エラーは次のようになります。

snapshot

「Topping ids」をどのように変更したり取り除いたりするのですか?私はメッセージを変更する方法を学びましたが、私は "Toppings ids"のために私が何を変更するのかは分かりませんが、明らかにユーザーには役に立たないものです。私は他のフォームの検証を使用していたので、私はそれらのエラーを見ることができるようにしたいので、これは私が変更する必要がある唯一のものです。

+0

と、このエラーメッセージが表示されます特定の属性に対して –

答えて

1

カスタムエラーメッセージにロケールを使用します。

# config/locales/en.yml 
en: 
    activerecord: 
    attributes: 
     pizza: 
     topping_ids: "" 

属性名を上書きする必要があります。あなたは

errors.full_messages 

か、代わりに<% object.errors.values.flatten.each do |msg| %>を使用することができerrors.messages代わりのerrors.full_messages

+0

ロケールの特定の属性を変更すると、必要なものが完全に機能します。ありがとう! – ravip0711

0

で行くを使用するとき

しかし、属性名を覚えてはどこにも表示されません。

0

またはこの試してください:あなたの代わりに行う場合

<% object.errors.full_messages.each do |attr,msg| %> 
    <li class="errors-alert-item text-center"><%= msg %></li> 
<% end %> 

を:

<%= attr %> <%= msg %> 

をあなたは地元のファイルに名前の代替を提供する必要が属性名

+0

ああそれは動作するが、私は私のコードDRYを維持するために複数のフォームに使用したい部分的なエラーコードを持っている。私はそれを完全に削除することができないように、他のバリデーションやフォームには<%= attr %>が必要です。ありがとう! – ravip0711

関連する問題