Помощник options_for_select
принимает массив опций и строит выбор. Из документов:
options_for_select([["Dollar", "$"], ["Kroner", "DKK"]])
<option value="$">Dollar</option>\n<option value="DKK">Kroner</option>
options_for_select([ "VISA", "MasterCard" ], "MasterCard")
<option>VISA</option>\n<option selected="selected">MasterCard</option>
options_for_select({ "Basic" => "$20", "Plus" => "$40" }, "$40")
<option value="$20">Basic</option>\n<option value="$40" selected="selected">Plus</option>
options_for_select([ "VISA", "MasterCard", "Discover" ], ["VISA", "Discover"])
<option selected="selected">VISA</option>\n<option>MasterCard</option>\n<option selected="selected">Discover</option>
Более подробные примеры есть в документации .
В зависимости от того, как настроены ваши данные, заполнить список может быть легко. Например:
options_for_select Country.select(:name).all.map { |c| c.name }
или для пользовательских значений
options_for_select Country.all.map { |c| [c.name, c.code] }
Что-то еще, что я видел несколько раз, это определение вспомогательного метода в модели, который возвращает правильные значения:
class Country
# awesome country logic goes here!
def self.array_for_select
select(:name).all.map { |c| c.name }
end
end
# a long time ago in a view far far away
options_for_select Country.array_for_select