Ответ 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'})
Удачи!
Можно ли добавить <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>
Возможно ли это, или я должен просто прокрутить коллекцию и сгенерировать параметры вручную?
Вместо этого вы должны использовать select
.
Так же:
f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + [ [ 'Or create a new one', 'new' ] ], {:include_blank => 'Please select a category'})
Удачи!
Согласился на короткий ответ. Нет и длинный ответ "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
.
Я не могу прокомментировать иначе я бы добавил это в ответ выше.
Чтобы получить опцию- > значение "новый", "или создать новый" вместо
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'})
обратите внимание на дополнительные [] параметры. Это заставляет массив работать как опция, пара значений
Короткий ответ: нет.
Длинный ответ: Конечно, но вы должны быть хитрыми.
Создайте такой класс:
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')]
, чтобы выполнить по существу то же самое.