Rails - возвращает массив месяцев для тега select - PullRequest
14 голосов
/ 06 апреля 2011

Я нахожусь в приложении на Rails 2.3.8, и мне нужно вернуть массив названий месяцев и номеров, которые должны быть включены в оператор options_for_select. То, что у меня есть, так это работает, но не совсем. Причина, по которой я так поступаю, заключается в том, что в операторе select требуется приглашение, которое вы не можете задать по умолчанию options_for_select в 2.3.8 (по крайней мере, насколько мне известно).

Вот что у меня есть:

@months = [['-', '']]
(1..12).each {|m| @months << [[Date::MONTHNAMES[m], m]]}

Итак, что я хочу получить, так это варианты:

<option value="1">January</option>
<option value="2">February</option>

Однако вместо этого я получаю:

<option value="January1">January1</option>
<option value="February2">February2</option>

Чего мне не хватает?

Ответы [ 10 ]

30 голосов
/ 06 апреля 2011

Попробуйте!

@months = [['-', '']]
(1..12).each {|m| @months << [Date::MONTHNAMES[m], m]}
18 голосов
/ 28 июля 2011
Date::MONTHNAMES.each_with_index.collect{|m, i| [m, i]}
=> [[nil, 0], 
    ["January", 1], 
    ["February", 2], 
    ["March", 3], 
    ["April", 4], 
    ["May", 5], 
    ["June", 6], 
    ["July", 7], 
    ["August", 8], 
    ["September", 9], 
    ["October", 10], 
    ["November", 11], 
    ["December", 12]]

Сокращенный выбор с опцией по умолчанию

Date::ABBR_MONTHNAMES.compact.each_with_index.collect{|m, i| [m, i+1]}
                     .insert(0, ['Please Select', nil])
=> [["Please Select", nil], 
    ["Jan", 1], 
    ["Feb", 2], 
    ["Mar", 3], 
    ["Apr", 4], 
    ["May", 5], 
    ["Jun", 6], 
    ["Jul", 7], 
    ["Aug", 8], 
    ["Sep", 9], 
    ["Oct", 10], 
    ["Nov", 11], 
    ["Dec", 12]]
11 голосов
/ 20 февраля 2013

Вы можете использовать rails helper select_month, например:

select_month(Date.today)
2 голосов
/ 24 апреля 2019

Вот сексуальный способ получить месяцы, только если это все, что вы хотите:

Date::MONTHNAMES.slice(1..-1).map(&:to_sym)
1 голос
/ 25 августа 2015

Если вы хотите, чтобы он был переведен на выбранный язык.

t("date.month_names")
1 голос
/ 25 сентября 2014

Работает на ROR 4

select_month(0 , prompt: 'Choose month')
0 голосов
/ 29 июня 2019

Нашел этот изящный способ отменить первое nil, но вернуть новую коллекцию месяцев.Вы не можете использовать shift для этого, так как это попытается изменить замороженную переменную.

Date::MONTHNAMES.drop(1)
0 голосов
/ 24 мая 2018

Это мое решение для вас , если вы работаете с проектами на основе I18n , для которых требуются многоязычные функции:

def month_array
  # Gets the first day of the year
  date = Date.today.beginning_of_year
  # Initialize the months array
  months = {}

  # Iterate through the 12 months of the year to get it's collect
  12.times do |i| # from 0 to 11
    # Get month name from current month number in a selected language (locale parameter)
    month_name = I18n.l(date + i.months, format: '%B', locale: :en).capitalize
    months[month_name] = i + 1
  end
  return months
end

# => {"January"=>1, "February"=>2, "March"=>3, "April"=>4, "May"=>5, "June"=>6, "July"=>7, "August"=>8, "September"=>9, "October"=>10, "November"=>11, "December"=>12}

Привет

0 голосов
/ 26 апреля 2018
# alternative 1 
Date::MONTHNAMES.compact.zip(1.upto(12)).to_h

# alternative 2
Date::MONTHNAMES.compact.zip([*1..12]).to_h

Выходы:

{"Январь" => 0, "Февраль" => 1, "Март" => 2, "Апрель" => 3, "Май" => 4, "June" => 5, "July" => 6, "August" => 7, "September" => 8, "October" => 9, "November" => 10, "December" =>11}

Пример:

# using simple_form
f.input :month, collection:  Date::MONTHNAMES.compact.zip(1.upto(12)).to_h
0 голосов
/ 12 мая 2016

Попробуйте

<% (1..12).each do |month|%>
  <%= link_to t('date.month_names')[month], '#' %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...