在options_for_select上使用帮助器

时间:2017-11-07 11:23:07

标签: ruby-on-rails ruby-on-rails-5

我选择了一年中所有月份的数字(1,2,3 ... 12)以及将月份数转换为其名称的方法。例如:(1 - > 1月,2月,2月......)

我想在select上使用它,显示月份的名称而不是数字。

我的问题是,如何生成一个选择,将此方法传递给下面的options_for_select

<div class="ls-custom-select">
  <%=
    form.select(
        :month,
        options_for_select((1..12), selected: @current_month),
        {},
        { class: "ls-select" }
      )
  %>
</div>

提前致谢

1 个答案:

答案 0 :(得分:1)

您可以使用一对数组来获取单独的文本和值:

options_for_select([["January", 1], ["February", 2]])
# => <option value="1">January</option>
# => <option value="2">February</option>

您可以使用Rails 18n模块获取本地化的月份名称:

(1..12).to_a.zip(I18n.t("date.month_names").drop(1))
# => [[1, "January"], [2, "February"], [3, "March"], [4, "April"], [5, "May"], [6, "June"], [7, "July"], [8, "August"], [9, "September"], [10, "October"], [11, "November"], [12, "December"]]

.zip将两个数组合并为一对。因为month_names数组中的第一个元素是nil(没有0月),所以需要.drop(1)

<div class="ls-custom-select">
  <%=
    form.select(
        :month,
        options_for_select(
          (1..12).to_a.zip(I18n.t("date.month_names").drop(1),
          @current_month # selected
        )
        {},
        { class: "ls-select" }
    )
  %>
</div>

您不需要编写方法来获取月份名称。使用I18n.t("date.month_names")[number]。或者,如果本地化不重要,请使用Date::MONTHNAMES[number]