简体   繁体   中英

How to properly pass collection for input in Formtastic

I need to pass a collection to the standard select input in Formtastic:

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

The problem is, though that I need Formtastic to access a different method than name. Now this is really a problem. I can always pass the Array

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

The problem is, that after this I will get strings in the controller instead of IDs which is not desired. I tried to pass Hash instead:

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

Now the problem is, that since I am using Ruby 1.8.7, the Hash order is unspecified and I of course need ordered input...

I can imagine some solutions, but all of those require unnecessary code.

Any idea how to solve this right?

尝试:

f.input :apple, :as => :select, :collection => Apple.all, :label_method => :format_name, :value_method => :id

在formtastic文档中没有直接指示,但集合也可以是嵌套数组,因此问题通过以下方式解决:

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

This is the correct way now:

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

This sets collection to an array of [name, id] tuples. Easy!

Soon-to-be deprecated way:

Use the member_label option, eg

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

Documentation is here in a code comment .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM