如何在Formtastic中正确传递集合输入

时间:2010-09-04 15:52:03

标签: ruby-on-rails ruby ruby-on-rails-3 formtastic

我需要将一个集合传递给Formtastic中的标准选择输入:

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

问题是,虽然我需要Formtastic来访问与名称不同的方法。现在这确实是一个问题。我总是可以传递数组

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

问题是,在此之后我会在控制器中获取字符串而不是不需要的ID。我试图传递哈希:

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 个答案:

答案 0 :(得分:15)

尝试:

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

现在这是正确的方法:

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

文档为here in a code comment