Вспомогательный метод Rails collection_select и опция «Создать элемент» - PullRequest
12 голосов
/ 31 марта 2009

Можно ли добавить <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>

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

Ответы [ 4 ]

11 голосов
/ 31 марта 2009

Вы, вероятно, должны использовать select вместо.

Вот так:

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

Удачи!

3 голосов
/ 03 августа 2010

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

Оберните следующую строку внутри тегов 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.

1 голос
/ 22 мая 2011

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

Чтобы получить параметр-> значение «новый», «или создать новый» .. вместо

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'})

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

0 голосов
/ 31 марта 2009

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

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

  • Создайте класс примерно так:

    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')], чтобы выполнить по сути то же самое.

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