0

1 から 31 までの日を含むコレクション セットがあります。モデルで検証します。ページが :birth エラーで読み込まれると、プロンプト「Day」がドロップダウン ボックスに表示されなくなります。

私からしてみれば

<%= f.label :birth %>
<%= f.collection_select(:birth_day, 1..31, :to_i, :to_i , :prompt=>'Day') %>

私のモデルでは

validate :validate_dates

def validate_dates  
  b_month = self.birth_month.to_i

  if (b_month == 4 || b_month == 6 || b_month == 9 || b_month == 11)
    if (self.birth_day == 31)
      self.errors.add(:birth, "is invalid")
    end
  end
end

生成されたソース - エラー前

<label for="individual_birth">Birth</label>
<select id="individual_birth_day" name="individual[birth_day]">
  <option value="">Day</option>
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
  <option value="4">4</option>
  <option value="5">5</option>
  ....
 </select>

生成されたソース - エラー後

<div class="field_with_errors"><label for="individual_birth">Birth</label></div>
<select id="individual_birth_day" name="individual[birth_day]">
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
  <option value="4">4</option>
  <option value="5">5</option>
  ....
  <option value="31" selected="selected">31</option>
 </select>

私が間違っていることを教えてください。日は必須フィールドではないため、ドロップダウンにプロンプ​​トが必要です。ありがとう!

4

1 に答える 1

0

field_error_procこのコードを配置してオーバーライドしてみてくださいconfig/application.rb

config.action_view.field_error_proc = Proc.new { |html_tag, instance| 
  "#{html_tag}".html_safe 
}

https://gist.github.com/1464315をオーバーライドする別の例field_error_proc

クレジット: https://stackoverflow.com/a/5268106/643500

それでもうまくいかない場合は、その機能と、それが何をしているのかを調べて、:prompt=>'Day'が消えます。

編集:

さらにテストした結果、ユーザーがすでに値を選択してフォームを送信しようとしたときに問題が発生したようです。これにより、新しく選択された値を保持したまま、他のすべてのエラーが表示されるcollection_selectため、プロンプトは省略されます (既に値があります)。

これを解決するcollection_selectには、selectwithに変更しますoptions_from_collection_for_select

何かのようなもの

<%= f.select "element_name", options_from_collection_for_select(@my_select_collection, :my_value_method, :my_text_method, 0), {:prompt => "Day"} %> # 0 or nothing (holds default)

このようにして、デフォルト値を常に 0 に設定するか、空のままにしnilます。このようにして、デフォルトに設定される有効な値がないことが保証されます (有効な値にデフォルト設定されている場合、プロンプトは表示されません)。

もう 1 つの方法は を使用すること:include_blankですが、それには 'Day' がありません。これは、何も変更せずにシナリオで機能します。:prompt => 'Day'に置き換えるだけ:include_blank => trueです。常に空のオプションがあります。JS を使用して空白を値にリセットできます。

于 2012-11-19T19:57:14.420 に答える