Как я могу интегрировать гем country_select с редактированием best_in_place?

Я использую гем best_in_place для редактирования встроенных записей и country_select для отображения списка стран для выбора. При использовании best_in_place для редактирования поля выбора я делаю следующее:

<%= best_in_place(@home, :country_name, :type => :select, :collection => [[1, "Spain"], [2, "Italy"]]) %>

Теперь мне нравится получать список всех стран, которые есть у country_select, и передавать его в параметр коллекции. Гем country_select предоставляет простой помощник для отображения поля выбора:

<%= country_select("home", "country_name") %>

Я хотел бы заменить параметр :collection в помощнике best_in_place, чтобы включить список стран, предоставленный country_select. Я знаю, что best_in_place ожидает ввод [[key, value], [key, value],...] в :collection, но я не знаю, как это сделать. Пожалуйста, порекомендуйте. Спасибо


person Hishalv    schedule 20.04.2012    source источник


Ответы (3)


Просто сделайте следующее, и это сработает:

<%= best_in_place @home, :country, type: :select, collection: (ActionView::Helpers::FormOptionsHelper::COUNTRIES.zip(ActionView::Helpers::FormOptionsHelper::COUNTRIES)) %>
person Chim Kan    schedule 11.06.2012
comment
спасибо, это работает как шарм. если возможно, не могли бы вы объяснить материал части коллекции, я не понимаю, почему это работает. - person Hishalv; 15.06.2012
comment
Жемчужина страны находится внутри ActionView::Helpers. Если вы проверите код из этого драгоценного камня, вы увидите, что он заключен в ActionView, Helpers и FormOptionsHelper. Итак, если вы хотите получить доступ к константе COUNTRIES, вам нужно добавить весь этот API. Метод zip — это метод из Array. Он просто добавляет предыдущий элемент в массив. - person Chim Kan; 18.06.2012

Если вы используете rails 4 несколько лет спустя, это помогает:

<%= best_in_place @cart.order, :country_name, type: :select, :collection =>  ActionView::Helpers::FormOptionsHelper::COUNTRIES%>
person Branny    schedule 19.05.2014

В Rails 5.2, предполагая, что у вас есть гем Страны, вы должны сделать:

<%= 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
person Sprachprofi    schedule 07.05.2020