#ruby-on-rails #ruby-on-rails-3 #select
#ruby-on-rails #ruby-on-rails-3 #выберите
Вопрос:
У меня есть это в моей модели:
LOCATION_IN_UK = {'England' => [['Berkshire', 1],['Cambridgeshire',2],['Cheshire',3]], 'Scotland' => [['Dumfries and Galloway',4],['Fife',5],['Lothian',6]], 'Others' => [['Outside UK',7]]}
И это в представлении:
<%= select_tag :location, grouped_options_for_select(Location::LOCATION_IN_UK), :id => 'location-dropdown' %>
Этот код генерирует следующий html:
<select id="location-dropdown" name="location">
<optgroup label="England">
<option value="1">Berkshire</option>
<option value="2">Cambridgeshire</option>
<option value="3">Cheshire</option></optgroup>
<optgroup label="Others">
<option value="7">Outside UK</option></optgroup>
<optgroup label="Scotland">
<option value="4">Dumfries and Galloway</option>
<option value="5">Fife</option>
<option value="6">Lothian</option></optgroup>
</select>
1. Как пропустить алфавитный порядок сортировки. Я хочу, чтобы элементы располагались точно так же, как в хэше LOCATION_IN_UK.
2. Как вставить в это приглашение? :prompt => 'Please select'
Не работает
Ответ №1:
Чтобы ответить на ваш вопрос о подсказке, подсказка — это не хэш, это третий параметр вызова метода. Итак, вы бы сделали:
<%= select_tag :location, grouped_options_for_select(LOCATIONS_IN_UK, nil, "Please Select"), :id => 'location-dropdown' %>
И, глядя на исходный код, кажется, что нет способа пропустить сортировку. Однако вы могли бы написать свой собственный вспомогательный метод. Вот источник
# File actionpack/lib/action_view/helpers/form_options_helper.rb, line 449
def grouped_options_for_select(grouped_options, selected_key = nil, prompt = nil)
body = ''
body << content_tag(:option, prompt, { :value => "" }, true) if prompt
grouped_options = grouped_options.sort if grouped_options.is_a?(Hash)
grouped_options.each do |group|
body << content_tag(:optgroup, options_for_select(group[1], selected_key), :label => group[0])
end
body.html_safe
end
Вы могли бы изменить / переопределить этот метод, но это может привести к сбою, если вы используете эту функцию в другом месте, поэтому я бы посоветовал вам поместить следующее в свой application_helper.
def unsorted_grouped_options_for_select(grouped_options, selected_key = nil, prompt = nil)
body = ''
body << content_tag(:option, prompt, { :value => "" }, true) if prompt
##Remove sort
#grouped_options = grouped_options.sort if grouped_options.is_a?(Hash)
grouped_options.each do |group|
body << content_tag(:optgroup, options_for_select(group[1], selected_key), :label => group[0])
end
body.html_safe
end
Затем вы можете вызвать unsorted_grouped_options_for_select, и это должно сработать.
<%= select_tag :location, unsorted_grouped_options_for_select(LOCATION::LOCATION_IN_UK, nil, "Please Select"), :id => 'location-dropdown' %>
Комментарии:
1. извините, это не работает. мне указано неправильное количество аргументов (3 вместо 2). я пытаюсь удалить nil, все работает, но опция запроса не появляется
2. На какой версии rails вы работаете? Также, смотрите мои правки, если вы используете мою 2-ю функцию, то она должна работать.
3. похоже, что запрос не работает с select_tag, я оборачиваю его в форму и вызываю как f.select, и теперь работает нормально. Рассмотрим проблему с порядком. Спасибо!
4. подсказка не является свойством тега select, это свойство grouped_options_for_select. В любом случае, я рекомендую вам взглянуть на мои правки, которые должны решить обе проблемы. Я протестировал его, и он отлично работает.
Ответ №2:
У меня была такая же проблема. Вы можете решить эту проблему, используя версию массива вместо хэшей, поскольку он упорядочивает ее только в том случае, если это_a?(Хэш). Смотрите документы для формата:http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/grouped_options_for_select
Комментарии:
1. Это намного лучше, чем переопределение помощника select_tag. Должно быть поддержано