我使用best_in_place gem来编辑内联记录和country_select以呈现可供选择的国家/地区列表。当使用best_in_place编辑选择字段时,我这样做:
<%= best_in_place(@home, :country_name, :type => :select, :collection => [[1, "Spain"], [2, "Italy"]]) %>
现在,我希望获得country_select所有国家/地区的列表,并将其传递到collection参数中。 country_select gem提供了一个简单的帮助器来呈现选择字段:
<%= country_select("home", "country_name") %>
我想替换best_in_place帮助器中的:collection参数,以包含country_select提供的国家/地区列表。我知道best_in_place期望[[key,value],[key,value],...]输入:collection,但我不知道如何做到这一点。请指教。感谢
答案 0 :(得分:5)
只需执行以下操作即可:
<%= best_in_place @home, :country, type: :select, collection: (ActionView::Helpers::FormOptionsHelper::COUNTRIES.zip(ActionView::Helpers::FormOptionsHelper::COUNTRIES)) %>
答案 1 :(得分:0)
如果你在几年后使用rails 4,那就可以了:
<%= best_in_place @cart.order, :country_name, type: :select, :collection => ActionView::Helpers::FormOptionsHelper::COUNTRIES%>
答案 2 :(得分:0)
在Rails 5.2中,假设您拥有“国家/地区” gem,则应该这样做:
<%= best_in_place @home, :country, type: :select, collection: ISO3166::Country.all_names_with_codes.fix_for_bip, place_holder: @home.country %>
fix_for_bip是我插入到Array类中的一个自定义函数,因为best_in_place要求所有选择框数组的排列顺序与常规选择框的顺序相反:对于常规的Rails选择,您需要提供一个数组[["Spain", "ES"], ["Sri Lanka", "SR"], ["Sudan", "SD"]...]
(首先是用户看到的,然后是选项值)。这就是“国家”瑰宝的回报。但是,best_in_place collection:
仅接受相反类型的数组:[["ES", "Spain"], ["SR", "Sri Lanka"], ["SD", "Sudan"]]
。当并非所有数组项本身都是两个项目的数组时,它也会产生问题-Rails选择框会自动处理这些问题。因此,我创建了一个fix_for_bip函数,在将所有数组提供给best_in_place时会对其进行调用:
class Array
def fix_for_bip
self.map { |e| e.is_a?(Array) ? e.reverse : [e, e] }
end
end