2012-11-19 37 views
0

我有一個收集集合,有1至31個月的日子。我在我的模型中驗證。當頁面加載出生錯誤時,提示「日」不再位於我的下拉框中。收集不包括錯誤後提示

在我看來

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

請讓我知道我做錯了什麼。我需要下拉提示,因爲Day不是必填字段。謝謝!

+0

你可以發佈前後生成的HTML元素嗎? –

+0

我添加了生成的HTML。謝謝! –

回答

0

嘗試通過將該代碼config/application.rb

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

覆蓋field_error_proc另一個例子重寫field_error_prochttps://gist.github.com/1464315

信用:https://stackoverflow.com/a/5268106/643500

如果不能做到這一點,看看該函數和它所這樣做會導致:prompt=>'Day'消失。

編輯:

更多測試問題似乎是,當用戶已經選擇了價值,並試圖提交表單後。這會導致所有其他錯誤,同時仍持有collection_select因此省略提示的新的選擇值出現(已經有一個值)

爲了解決這個改變你collection_selectselectoptions_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。這樣我們保證沒有有效的默認值(如果默認爲有效值提示不會顯示)

另一種方式是使用:include_blank,但不會有'日'。這適用於您的方案,無需更改任何內容。只需將:prompt => 'Day'替換爲:include_blank => true即可。總會有一個空的選擇。您可以使用JS將空白重置爲一個值。

+0

覆蓋不起作用。不過謝謝。 –

+0

D3mon - 我試着完全按照你的建議,在頁面刷新時提示「Day」消失。 '<%= f.select:birth_day,options_from_collection_for_select(1..31,:to_i,:to_s,0),{:prompt =>「Day」}%>'。不幸的是有點更糟。現在,當頁面上顯示錯誤時,下拉列表會變爲第一個條目 - 「1」,提示消失。我正在使用Rails 3.2.6。 –