我正在使用 best_in_place gem 内联编辑记录,country_select呈现可供选择的国家/地区列表。使用 best_in_place 编辑选择字段时,我这样做:
<%= best_in_place(@home, :country_name, :type => :select, :collection => [[1, "Spain"], [2, "Italy"]]) %>
现在,我想获取country_select拥有的所有国家/地区的列表,并将其传递到集合参数中。country_select gem 提供了一个简单的帮助程序来呈现选择字段:
<%= country_select("home", "country_name") %>
我想替换best_in_place助手中的 :collection 参数以包含 country_select 提供的国家/地区列表。我知道best_in_place期望 [[键,值]、[键、值],...] 输入到 :collection 中,但我不确定如何做到这一点。请指教。谢谢
只需执行以下操作即可:
<%= best_in_place @home, :country, type: :select, collection: (ActionView::Helpers::FormOptionsHelper::COUNTRIES.zip(ActionView::Helpers::FormOptionsHelper::COUNTRIES)) %>
在 Rails 5.2 中,假设你有 Country 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
几年后使用 rails 4 ,这可以解决问题:
<%= best_in_place @cart.order, :country_name, type: :select, :collection => ActionView::Helpers::FormOptionsHelper::COUNTRIES%>