Подтвердить что ты не робот

Rails 'collection_select вспомогательный метод и опция "Создать элемент" в конце

Можно ли добавить <option> в конце <select>, созданного с помощью вспомогательного метода collection_select?

Сейчас у меня

f.collection_select(:category_id , @categories, :id, :name, {:prompt => 'Please select a category'})

который генерирует

<select id="product_category_id" name="product[category_id]">
  <option value="">Please select a category</option>
  <option value="7">category one</option>
  <option value="8">category 2</option>
</select>

и я бы хотел, чтобы

<select id="product_category_id" name="product[category_id]">
  <option value="">Please select a category</option>
  <option value="7">category one</option>
  <option value="8">category 2</option>
  <option value="new">..or create a new one</option>
</select>

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

4b9b3361

Ответ 1

Вместо этого вы должны использовать select.

Так же:

f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + [ [ 'Or create a new one', 'new' ] ], {:include_blank => 'Please select a category'})

Удачи!

Ответ 2

Согласился на короткий ответ. Нет и длинный ответ "Be Crafty", но вот то, что я только что сделал, что, по моему мнению, проще любого из этих двух решений и работал у меня:

Оберните следующую строку внутри тегов erb, т.е. <%= и %>:

f.collection_select :advertisement_group_id, AdvertisementGroup.find(:all, :order => "name DESC") << AdvertisementGroup.new(:name => "New Group"), :id, :name, :include_blank => true  

Просто создайте новый объект с помощью .new и передайте любой текст, который вы хотите отобразить вместе с :include_blank => true.

Ответ 3

Я не могу прокомментировать иначе я бы добавил это в ответ выше.

Чтобы получить опцию- > значение "новый", "или создать новый" вместо

f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + ['Or create a new one','new'], {:include_blank => 'Please select a category'})

делать

f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + [['Or create a new one','new']], {:include_blank => 'Please select a category'})

обратите внимание на дополнительные [] параметры. Это заставляет массив работать как опция, пара значений

Ответ 4

Короткий ответ: нет.

Длинный ответ: Конечно, но вы должны быть хитрыми.

  • Создайте такой класс:

    class New_option_placeholder
      def id 
        "new"
      end
    
      def name
        "...or create a new one"
      end
    end
    
  • Вместо передачи @categories, перейдите @categories+New_option_placeholder.new

Если (как указано в комментариях), вы ищете что-то, что могли бы require "ostruct", а затем передать @categories + [OpenStruct.new(:id => 'new',:name => '...or create a new one')], чтобы выполнить по существу то же самое.