2017-02-16 19 views
0

Мы переходим из Rails 3.2.13 в Rails 4.0.13.grouped_collection_select - изменения group_method с Rails 3 до 4

Мы используем помощник Rails grouped_collection_select для гнездования <optgroup> s.

Я заметил, что из Rails 3.2.13 - 4.0.2 произошли изменения в источнике.

http://apidock.com/rails/v4.0.2/ActionView/Helpers/FormOptionsHelper/grouped_collection_select

Наше использование метода не работает в настоящее время.

Вот наш код:

<%= f.grouped_collection_select :location_id, @participating_businesses, :"active_locations(#{current_user.id})", :name, :id, :name, {prompt: t('.prompt_select_location')}, class: 'location-selector form-control' %> 

Здесь ошибка:

ActionView::Template::Error (undefined method `active_locations(7)' for #<ParticipatingBusiness:0x005583478f1f90>): 

Теперь стало ясно, что они изменили посланный как метод GET в.

Я предполагаю, что в настоящее время они захватывают опцию group_method и помещают ее непосредственно в send(:group_method), что объясняет указанную выше ошибку.

Однако, как я могу передать аргумент моему group_method, который полагается на сеанс (также известный как current_user).

Рассматривая источник, я не думаю, что это вполне возможно.

http://www.rubydoc.info/docs/rails/4.1.7/ActionView/Helpers/Tags/GroupedCollectionSelect#initialize-instance_method

Должен ли я смотреть на переписывание этой работы с нашей целью, без помощников или чуть более ручной?

Неужели кто-нибудь сталкивается с тем же вопросом?

+0

Учитывая вы знаете, он просто передает 'group_method' переменную непосредственно отправить, что, если вы пытались использовать' [: active_locations, current_user.id] 'вместо этого? –

+0

Это довольно умное исправление, однако я уже пробовал и получил 'ActionView :: Template :: Error ([: active_locations, 7] не символ)'. – fbelanger

+0

darn:/было бы неплохо, если бы это Just Worked ... Возможно, вам придется запросить его для Rails. Похоже, что обычный 'collection_for_select' может принимать' Proc', но я видел проблему, с которой сгруппированная версия работает не так. –

ответ

1

Это становилось все более расстраивающим.

Я выкопал источник Rails для версии 4.0.13 и функцию option_groups_from_collection_for_select.

def option_groups_from_collection_for_select(collection, group_method, group_label_method, option_key_method, option_value_method, selected_key = nil) 
    collection.map do |group| 
     option_tags = options_from_collection_for_select(
     group.send(group_method), option_key_method, option_value_method, selected_key) 

     content_tag("optgroup".freeze, option_tags, label: group.send(group_label_method)) 
    end.join.html_safe 
    end 

https://github.com/rails/rails/blob/92703a9ea5d8b96f30e0b706b801c9185ef14f0e/actionview/lib/action_view/helpers/form_options_helper.rb#L455

Он посылает method_group непосредственно send.

Как предложил Taryn East, я попытался сделать group_method массив символа и аргумент для этого метода.

Однако это вызывает TypeError - [:accessible_locations, 15] is not a symbol.

Это значение выражается send, так как этому массиву нужен оператор splat внутри вызова отправки для работы в качестве аргументов метода.

Теперь возникает важный вопрос, который мы собираемся ответить на первоначальный вопрос.

Как это работает раньше?

Глядя на источник старой версии Rails на Github не показали никакой разницы, поэтому я использовал активизировали через код и нашел это:

421: def option_groups_from_collection_for_select(collection, group_method, group_label_method, option_key_method, option_value_method, selected_key = nil) 
422: collection.map do |group| 
423:  group_label_string = eval("group.#{group_label_method}") 
424:  "<optgroup label=\"#{ERB::Util.html_escape(group_label_string)}\">" + 
425:  options_from_collection_for_select(eval("group.#{group_method}"), option_key_method, option_value_method, selected_key) + 
426:  '</optgroup>' 
427: end.join.html_safe 
428: end 

Вот как это работало раньше.

Поскольку это был eval-всего целого group.group_method код метода, он не поднимет undefined method - method_name(args).

Так что ответ: да, переписывание было необходимо.

Я обошел это, используя вспомогательный помощник grouped_options_for_select и построил массив.

http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/grouped_options_for_select

 Смежные вопросы

  • Нет связанных вопросов^_^