помощник select_tag с порядком grouped_options_for_select - PullRequest
3 голосов
/ 10 апреля 2011

У меня есть это в моей модели:

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' Не работает

Ответы [ 2 ]

11 голосов
/ 10 апреля 2011

Чтобы ответить на ваш запрос, приглашение не является хешем, это третий параметр вызова метода.Итак, вы должны сделать:

 <%= 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' %>
2 голосов
/ 17 сентября 2014

У меня была такая же проблема.Вы можете решить эту проблему, используя версию массива вместо хешей, так как он упорядочивает его только если это is_a?Смотрите документы для формата: http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/grouped_options_for_select

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...