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>

请让我知道我做错了什么。我需要下拉菜单中的提示,因为 Day 不是必填字段。谢谢!

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 
}

另一个覆盖field_error_proc https://gist.github.com/1464315的示例

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

如果那不这样做,请查看该功能以及它正在做什么导致:prompt=>'Day'消失。

编辑:

经过更多测试后,问题似乎是用户已经选择了一个值并尝试提交表单。这会导致出现所有其他错误,同时仍保留新选择的值,collection_select因此省略提示(已有值)

要解决此问题,请将您更改collection_selectselectwithoptions_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,但不会有“Day”。这适用于您的场景,无需更改任何内容。只需替换:prompt => 'Day':include_blank => true. 总会有一个空选项。您可以使用 JS 将空白重置为一个值。

于 2012-11-19T19:57:14.420 回答