Создайте тег выбора, в котором некоторые параметры сгруппированы, а другие нет. - PullRequest
2 голосов
/ 02 января 2011

Я использую Rails 3. Я хочу создать тег выбора, в котором некоторые параметры сгруппированы, а другие нет.Параметры выглядят примерно так:

Income
Auto
  Fuel
  Maintenance
Home
  Maintenance
  Mortgage

В этом примере Income - это не группа, а Auto и Home.

Я вижу три вспомогательных метода grouped_options_for_select и grouped_collection_select, option_groups_from_collection_for_select, но все они требуют наличия группы для каждого параметра.

Есть ли способ использоватьпомощник, чтобы сделать это, или мне придется генерировать HTML сам?Я полагаю, что мог бы использовать двух разных помощников для создания опций и просто добавить результаты обоих.

Ответы [ 2 ]

2 голосов
/ 13 декабря 2012

Нет готового помощника (о котором я знаю), который мог бы сделать то, что вам нужно. Это несколько сложно сделать, потому что это будет зависеть от вашей модели данных. Это отношение типа «массив», «хэш», «родитель-ребенок» или «многие ко многим»?

Предполагая, что это родитель-потомок, вы можете использовать рекурсию для его построения:

def child_options_for_select(collection, children_method, group_label_method, child_value_method, child_label_method, options = {})
  body = ''
  collection.each do |item|
    children = item.send(children_method)
    if item.children.count != 0
      body << content_tag(:optgroup, child_options_for_select(children, children_method, group_label_method, child_value_method, child_label_method, options), :label => item.send(group_label_method))
    else
      body << content_tag(:option, item.send(child_label_method), :value => item.send(child_value_method))
    end
  end
  body.html_safe
end

Пример использования на ваш взгляд:

<%= select_tag 'foo', child_options_for_select(@categories.roots, :children, :to_s, :id, :to_s) %>

Обратите внимание, что это довольно медленно, поскольку включает в себя несколько поездок в базу данных.

0 голосов
/ 26 июля 2017

Используя ответ Aarons в качестве отправной точки, я сделал версию, которая принимает Hash в качестве ввода.

  def grouped_and_ungrouped_options_for_select(grouped_options, selected_key = nil)
    body = ''
    grouped_options.each do |key, value|
      selected = selected_key == value
      if value.is_a?(Hash)
        body << content_tag(:optgroup, grouped_and_ungrouped_options_for_select(value, selected_key), :label => key)
      else
        body << content_tag(:option, key, value: value, selected: selected)
      end
    end
    body.html_safe
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...