在带有rails的select中将选项值设置为数组索引

Tru*_*oft 9 html-select ruby-on-rails

我想使用rails collection_select或者options_for_select不是基于模型的数组项来创建一个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> 
Run Code Online (Sandbox Code Playgroud)

Jas*_*son 13

你也可以这样做一行if the_array = ['first', 'second', 'third']

<%= select "obj", "test", the_array.each_with_index.map {|name, index| [name,index]} %>
Run Code Online (Sandbox Code Playgroud)

我早在Rails 2.3.14中测试过它.


Tru*_*oft 11

我在问题中提到项目不是数据库中的对象,它们只是字符串,如下所示:

the_array = ['first', 'second', 'third']
Run Code Online (Sandbox Code Playgroud)

感谢Lichtamberg,我这样做了:

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

这给出了所需的输出:

<option value="0">first</option>
<option value="1">second</option>
<option value="2">third</option>
Run Code Online (Sandbox Code Playgroud)

我没有使用Hash,因为顺序很重要,我的ruby版本不大于1.9


Jos*_*ter 5

Ruby> = 1.9.3

Ruby(出色地)添加了一个with_index方法map,collect因此您现在可以执行以下操作:

options_for_select ['first', 'second', 'third'].collect.with_index.to_a
Run Code Online (Sandbox Code Playgroud)

这将为您提供以下HTML:

<option value="0">first</option>
<option value="1">second</option>
<option value="2">third</option>
Run Code Online (Sandbox Code Playgroud)

赞美Matz等人.