我如何将 country_select gem 与 best_in_place 编辑集成
Posted
技术标签:
【中文标题】我如何将 country_select gem 与 best_in_place 编辑集成【英文标题】:How can i integrate country_select gem with best_in_place editing 【发布时间】:2012-05-01 21:19:51 【问题描述】:我正在使用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 期望将 [[key, value], [key, value],...] 输入到 :collection 中,但我不知道该怎么做。请指教。谢谢
【问题讨论】:
【参考方案1】:只需执行以下操作即可:
<%= best_in_place @home, :country, type: :select, collection: (ActionView::Helpers::FormOptionsHelper::COUNTRIES.zip(ActionView::Helpers::FormOptionsHelper::COUNTRIES)) %>
【讨论】:
谢谢,它就像一个魅力。如果可能的话,你能解释一下收集部分的东西吗,我不明白它为什么会起作用。 国家宝石位于 ActionView::Helpers 内部。如果您检查该 gem 中的代码,您会看到它包含在 ActionView、Helper 和 FormOptionsHelper 中。所以,如果你想访问 COUNTRIES 常量,你需要添加所有的 API。 zip 方法是 Array 中的一种方法。它只是将前一个元素添加到数组中。【参考方案2】:如果您在几年后使用 rails 4,这可以解决问题:
<%= best_in_place @cart.order, :country_name, type: :select, :collection => ActionView::Helpers::FormOptionsHelper::COUNTRIES%>
【讨论】:
【参考方案3】:在 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
【讨论】:
以上是关于我如何将 country_select gem 与 best_in_place 编辑集成的主要内容,如果未能解决你的问题,请参考以下文章