2017-02-16 1 views
0

우리는 Rails 3.2.13에서 Rails 4.0.13으로 마이그레이션 중입니다.grouped_collection_select - group_method가 Rails 3에서 4로 변경됩니다.

중첩을 위해 레일 도우미 grouped_collection_select을 사용합니다.

레일즈 3.2.13에서 4.0.2로 변경된 소스가 있습니다. 방법의

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

우리의 사용은 현재 작동하지 않습니다. 여기

우리의 코드 :

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

지금은 그들이 어떻게 방법 GET의 보낸을 변경 한 것이 분명 : 여기

<%= 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' %> 

는 오류입니다.

저는 현재 group_method 옵션을 잡고 이것을 위의 오류를 설명하는 send(:group_method)에 직접 입력하고 있다고 생각합니다.

그러나 어떻게 세션 (별칭 : current_user)에 의존하는 내 group_method에 인수를 전달할 수 있습니까?

출처를 보면, 나는 그것이 가능하다고 생각하지 않습니다.

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 ...라면 좋았을 것입니다. 레일즈에 feature-request를해야 할 수도 있습니다. 보통'collection_for_select'가'Proc'를 취할 수있는 것처럼 보이지만'grouped' 버전이 똑같은 방식으로 작동하지 않는다는 것을 보았습니다. –

답변

1

점점 더 좌절했습니다.

나는 레일 소스 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

그것은 send에 직접 method_group을 보내고있다.

Taryn East가 제안한대로 group_method에 해당 방법에 대한 기호 및 인수 배열을 만들려고했습니다.

그러나 이것은 TypeError - [:accessible_locations, 15] is not a symbol을 발생시킵니다.

이 배열은 send 호출 내에서 메소드 인수로 작동하기 위해 splat 연산자가 필요하므로 send으로 발생합니다.

이제는 초기 질문에 대한 답변을 제공하는 중요한 질문을 제기합니다.

어떻게 이전에 작동 했습니까?

차이를 보이지 않았다 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