2010-08-16 4 views
1

У меня есть простая константа, называемая «субъектами» в моей модели Inquire.rb, и мне нравится знать, есть ли простой способ использовать позицию в массиве Ruby, а не делать хэш из нее с идентификаторами или более сложным массивом.Rails простые константы и выберите опции

Могу ли я это сделать?

i.e вместо вместо to_s, как это делается в настоящее время для значения в select, я хотел бы получить целое число, указывающее позицию вопроса в массиве. 1-5 в этом случае.

Благодаря

SUBJECTS = [ "I have a query about my booking", 
       "I can't find my confirmation email", 
       "I have feedback about a location", 
       "I have feedback about your website", 
       "Other enquiry" ] 

<%= f.collection_select :subject, Inquire::SUBJECTS, :to_s, :titleize, {:prompt => true} %>

+1

Как случайный случай, это хорошая вещь, чтобы вставить файл yaml внутри config/и загрузить с помощью YAML :: load_file. – alternative

ответ

2

Вы можете сделать что-то вроде этого

<%= select(:inquire, :subject_id, 
     Inquire::SUBJECTS.collect {|x| [x, Inquire::SUBJECTS.index(x) + 1] }) 
%>  

Это дает следующий HTML

<select id="inquire_subject_id" name="inquire[subject_id]"> 
    <option value="1">I have a query about my booking</option> 
    <option value="2">I can't find my confirmation email</option> 
    <option value="3">I have feedback about a location</option> 
    <option value="4">I have feedback about your website</option> 
    <option value="5">Other enquiry</option> 
</select> 
0

Вам просто нужно небольшой помощник, чтобы работать для вас. просто как то, что эта сборка в помощнике - http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html

module form_collection_helper 
    def options_with_index_for_select(items) 
     html = '' 
     items.each_with_index { |item, i| html << "<option value='#{i}'>#{item.titleize}</option>" } 
     return html 
    end 
end 

и в коде просто:

2

Или, вы можете использовать метод enum_with_index, которая доступна вам через перечислимых.

<%= f.select :name, Inquire::SUBJECTS.enum_with_index.collect { |s, i| [s.titleize, i] }, {:prompt=>true} %> 
Смежные вопросы