Как правильно передать коллекцию для ввода в Formtastic - PullRequest
12 голосов
/ 04 сентября 2010

Мне нужно передать коллекцию в стандартный ввод select в Formtastic:

f.input :apple, :as => :select, :collection => Apple.all

Проблема в том, что мне нужен Formtastic для доступа к методу, отличному от имени.Теперь это действительно проблема.Я всегда могу передать массив

f.input :apple, :as => :select, :collection => Apple.map { |a| a.format_name }

. Проблема в том, что после этого я получу строки в контроллере вместо идентификаторов, что нежелательно.Вместо этого я попытался передать Hash:

options = Hash.new
Apple.each { |a| Apple.store(a.format_name, a.id) }
f.input :apple, :as => :select, :collection => options

Теперь проблема в том, что, поскольку я использую Ruby 1.8.7, порядок хеширования не указан, и мне, конечно, нужен упорядоченный ввод ...

Я могу представить некоторые решения, но все они требуют ненужного кода.

Есть идеи, как решить эту проблему?

Ответы [ 3 ]

15 голосов
/ 05 сентября 2010

Попробуйте:

f.input :apple, :as => :select, :collection => Apple.all, :label_method => :format_name, :value_method => :id
4 голосов
/ 04 сентября 2010

В документации формы нет прямого указания, но коллекция также может быть вложенными массивами, поэтому проблема решается следующим образом:

f.input :apple, :as => :select, :collection => Apple.map { |a| [ a.format_name, a.id ] }
0 голосов
/ 22 марта 2017

Теперь это правильный путь:

f.input :apple,
        as: :select,
        collection: Apple.pluck(:format_name, :id)

Устанавливает collection в массив кортежей [name, id]. Легко!

Скоро будет объявлено устаревшим:

Используйте опцию member_label, например,

f.input :apple,
        as: :select,
        collection: Apple.all,
        member_label: :format_name

Документация здесь, в комментарии к коду .

...