我在表格中有以下内容:
<div class="col-sm-2 form-group">
<%= f.label :from_age, "From Age" %><br>
<%= f.select :from_age, [*-1..65], {}, class: "form-control" %>
</div>
<div class="col-sm-2 form-group">
<%= f.label :to_age, "To Age" %><br>
<%= f.select :to_age, [*-1..65] << 1000, {}, class: "form-control" %>
</div>
换句话说:
对于from_age
,用户选择数字-1到65之间的年龄。--1表示&#34;全部&#34;的概念。
对于to_age
,用户选择数字-1到65之间的年龄,也可以选择数字1000. -1表示&#34; All&#34;的概念,1000表示&#34;以及&#34;的概念。
指定from_age
和to_age
后,该应用现在可以说:
All
年龄18 and up
25-40
创建新代理时,上述代码可以正常运行,但用户需要知道值-1
代表up
,值1000
代表值{ {1}}。
我可以做得更好。我只需要在选择框中包含代表值的文字,因此在选择框内:用户看到and up
而不是-1
,而不是All
:1000
。
我的and up
模型中有以下内容:
Agency
所以基本上我需要告诉表单:&#34;是的,这些是值并且是正确的,但对于这些值的显示文本,请将这些方法用于表示通过该值的那些值的文本。形式。
Documentation on select form helper。
也许在这种情况下,最好使用collection_select?
更新:
感谢下面答案提供的帮助。以下是def from_age_to_s
if from_age == -1
return "All"
else
return from_age
end
end
def to_age_to_s
case to_age
when -1
"All"
when 1000
"+up"
else
to_age
end
end
的解决方案:
from_age
答案 0 :(得分:1)
您可以将[ [ 'Label 1', 'value 1' ], [ 'Label 2', 'value 2' ], ... ]
之类的数组传递给select
,这会产生以下选项:
<option value="value 1">Label 1</option>
<option value="value 2">Label 2</option>
...
但是我们还可以使用一个快捷方式:并非choice数组中的每个元素都必须是上面的[ label, value ]
数组。对于非数组的元素,select
将仅使用标签和值的值。换句话说,如果我们这样做:
choices = [ [ 'Foo', 1 ], 2, 3, [ 'Bar', 4 ] ]
...然后select
将呈现如下选项:
<option value="1">Foo</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">Bar</option>
有了这些知识,我们可以生成一个包含我们想要的标签和值的数组(你可能想让它在控制器的顶部变成一个常量,所以它只计算一次):
class MyController < ApplicationController
AGE_CHOICES = [ [ 'All', -1 ], *0..65, [ '+up', 1000 ] ]
# ...
end
puts MyController::AGE_CHOICES
# => [ [ 'All', -1 ],
# 0,
# 1,
# ...
# 65,
# [ '+up', 1000 ] ]
现在在您看来,您可以这样做:
<%= f.select :from_age, MyController::AGE_CHOICES, {}, class: "form-control" %>
...将呈现如下内容:
<option value="-1">All</option>
<option value="0">0</option>
<option value="1">1</option>
...
<option value="1000">+up</option>