2009-10-16 7 views
5

여러 개의 모델이있을 때 중첩 된 모델 양식에 문제가있어 모든 라디오 버튼이 같은 그룹에있는 것으로 처리됩니다.여러 개의 중첩 모델이있는 레일 형태로 인해 라디오 그룹에 문제가 발생합니다.

내 모델이 같은 has_many 관계 포함

class Order < ActiveRecord::Base 
    has_many :order_items 
    accepts_nested_attributes_for :order_items 
end 

Class OrderItem < ActiveRecord::Base 
    belongs_to :order 
end 

난 후,이 양식에 포함

<% fields_for "order[order_items_attributes][]", order_item do |f| %> 

및 사용 OrderItem 모델 형태를 생성하는 부분이이 라디오 버튼 그룹은 for 루프 안에 생성 된

radio_button_tag "order[order_items_attributes][][colour_id]", "#{colour.id}" 

T 하나의 자식이있을 때 그의 작품은 괜찮아요, 그러나 내가 여러 라디오 버튼을 삽입하자마자 모든 라디오 버튼은 모두 같은 속성을 가진 동일한 그룹에 속합니다. name="order[order_items_attributes][][colour_id]". 이 모든 것은 새로운 모델 형식이므로 배열 인덱스 (name="order[order_items_attributes][0][colour_id]")를 사용할 수 없습니다. 레일스에서 ​​오류를 제공합니다. expected Hash (got Array) for param 'order_items_attributes'마지막 부분에 대해 잘못되었습니다. 오류는 인덱싱 된 이름 속성과 색인되지 않은 이름 속성이 혼합되어 있기 때문에 발생했습니다. 색인 값을 추가하는 것이 이것을 해결하는 열쇠였습니다. 두 개의 중첩 모델이있을 때

{"order_items_attributes"=> 
    [{"size"=>"Small", 
    "colour_id"=>"4"], 
"first_name"=>"sdf", 
"last_name"=>"sdf", 
"email"=>"[email protected]"} 

그리고 :

{"order_items_attributes"=> 
    [{"size"=>"Small", 
    "colour_id"=>"4"}, 
    {"size"=>"Small"}], 
"first_name"=>"sdf", 
"last_name"=>"sdf", 
"email"=>"[email protected]"} 

는 만 볼 수 있듯이 최초의 단 하나의 중첩 된 모델이있을 때 여기

params[:order] 해시의 내용입니다 order_item에 colour_id 속성이 있습니다. 선택된 라디오 버튼이 어떤 모델에 속해 있는지에 관계없이 발생합니다 (이는 의미가 있습니다).

각 하위 모델에 대해 별도의 그룹을 만들도록 라디오 버튼을 렌더링하는 방법은 무엇입니까?

+0

하나의 중첩 된 order_item이있는 경우 (즉, 작동하는 경우)와 둘 이상의 중첩 된 order_item이있는 경우에 대해 params [: order] 해시의 내용을 붙여 넣을 수 있다면 도움이됩니다 (즉, 작동하지 않는 경우). 두 예제 모두 스택 오버플로에 붙여 넣기 전에 pretty print를 통해 params [: order] 해시를 실행하십시오. – nelstrom

답변

3

fields_for를 호출 할 때 각 주문 항목에 고유 색인을 제공해야합니다. 이런 식으로 fields_for를 호출하는 경우 fields_for에 전달하는 배열의 인덱스를 추적해야합니다. Rails는 중첩 된 양식을 사용하여이 작업을 수행 할 수 있습니다.

해결책은 중첩 된 양식을 사용하는 것입니다.

<%form_for :order do |f|%> 
    Form stuff for this particular order. 
    If @order.order_items is empty you may need to build one before the next line. 
    <%f.fields_for :order_items do |oi_f| %> 
    Form stuff for this particular order_item (prefixed with oi_f.) 
    <%Colour.all.each do |colour| %> 
     <%=oi_f.radio_tag(:colour_id, colour.id)%> 
    <%end%> 
    <%end%> 
<%end%> 

당신이 orders_controller에 게시하는 것처럼 보이므로 대체품으로 교체해야합니다.

+0

고마워, 이건 정확히 그랬어! Firebug를 사용하여 인덱스 값을 수동으로 추가하려고 시도했지만 언급 한 오류가 발생했습니다. 다른 양식 필드가 있었고 색인 및 색인화되지 않은 이름 속성이 혼합되어 있었기 때문입니다. – roryf