显示f.select选项的文本表示,而不是使用值rails

时间:2015-11-17 17:01:54

标签: ruby-on-rails ruby

我在表格中有以下内容:

<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_ageto_age后,该应用现在可以说:

  • 代理机构为All年龄
  • 的个人提供服务
  • 代理机构为年龄18 and up
  • 的个人提供服务
  • 代理机构为年龄25-40
  • 的个人提供服务

创建新代理时,上述代码可以正常运行,但用户需要知道值-1代表up,值1000代表值{ {1}}。

我可以做得更好。我只需要在选择框中包含代表值的文字,因此在选择框内:用户看到and up而不是-1,而不是All1000

我的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

1 个答案:

答案 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>
相关问题