Установка значения параметра в качестве индекса массива в выделении с рельсами - PullRequest
9 голосов
/ 24 октября 2010

Я хочу создать тег выбора, используя rails collection_select или options_for_select с элементами массива, которые не основаны на модели Значение параметра должно быть индексом массива каждого элемента.

Пример: желаемый вывод для ['first', 'second', 'third']:

<select id="obj_test" name="obj[test]">
    <option value="0">first</option> 
    <option value="1">second</option> 
    <option value="2">third</option> 
</select> 

Ответы [ 4 ]

13 голосов
/ 31 октября 2012

Вы также можете сделать это одной строкой, если the_array = ['first', 'second', 'third']

<%= select "obj", "test", the_array.each_with_index.map {|name, index| [name,index]} %>

Я проверял это еще в Rails 2.3.14.

11 голосов
/ 24 октября 2010

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

the_array = ['first', 'second', 'third']

Благодаря Лихтамбергу, я сделал это так:

f.select(:test, options_for_select(Array[*the_array.collect {|v,i| [v,the_array.index(v)] }], :selected => f.object.test)) %>

Что дает желаемый результат:

<option value="0">first</option>
<option value="1">second</option>
<option value="2">third</option>

Я не использовал Hash, потому что порядок важен, и моя версия ruby ​​не превышает 1.9

5 голосов
/ 28 мая 2015

Ruby> = 1.9.3

Ruby (блестяще) добавил метод with_index для map и collect, поэтому вы можете просто сделать следующее:

options_for_select ['first', 'second', 'third'].collect.with_index.to_a

И вы получите следующий HTML-код:

<option value="0">first</option>
<option value="1">second</option>
<option value="2">third</option>

Хвала Мац и др.

3 голосов
/ 24 октября 2010
@people = [{:name => "Andy", :id => 1}, {:name => "Rachel", :id => 2}, {:name => "test", :id => 3}]
# or
peop = ["Rachel", "Thomas",..]
@people = Hash[*peop.collect { |v| [v, a.index(v)] }.flatten]

, а затем

select_tag "people", options_from_collection_for_select(@people, "name", "id")
# <select id="people" name="people"><option value="1">Andy</option>....</select>

Другое решение (HAML-формат):

=select_tag("myselect")
  =options_for_select(array)

См. http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-options_for_select

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