помощник по выбору тегов с порядком группирования_options_for_select

#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. Должно быть поддержано