2012-08-10 2 views
6

accepts_nested_attributes_for를 사용하는 경우 "child_attributes"를 전달하지 않고 "child"를 전달하고 싶습니다. 내 컨트롤러에 많은 논리를 넣어 레코드와 어린이를 만들면이 작업을 수행 할 수 있습니다. 그러나 컨트롤러를 깨끗하게 유지하고 로직을 유지하려면이 모델을 사용하여 POST 또는 PUT을 수행 할 때이 구문을 사용하는 레일 3을 전환하는 방법을 알고 싶습니다. 레일 3 _attributes 지정없이 중첩 된 속성을 전달하는 방법은 무엇입니까

{ 
    "name": "test", 
    "child_attributes": [ 
    { 
     "id": 1, 
     "name": "test_child_update" 
    }, 
    { 
     "name": "test_child_create" 
    } 
} 

오히려

{ 
    "name": "test", 
    "child": [ 
    { 
     "id": 1, 
     "name": "test_child_update" 
    }, 
    { 
     "name": "test_child_create" 
    } 
} 
+1

왜 이것을 변경하고 싶은지 물어볼 수 있습니까? – Robin

+1

'child' 속성은'Child' 객체의 속성을 가리키는 것이 아니라'Child' 객체의 컬렉션을 실제로 참조하기 때문에이 규칙에 대한 이유가 있습니다. 'child_attributes' 속성은 의도를 명확히하기 위해 사용됩니다. – PinnyM

+0

나는 여기로 걸어 갈거야. 전달되는 객체의 유형은 의도를 결정하기에 충분해야합니다. 또한 JSON에는 클래스가 없기 때문에'_attributes'를 사용하여 실제로 아무것도 정리하지 않습니다. – user1158559

답변

4

는 분명,이 수행 할 수 없습니다.

+0

나는 당신이 뭔가를 할 수 없다는 것을 인정하는 스택의 유일한 사람이라고 생각합니다. –

1

_attributes 접미어는 JSON 요청 및 응답에 아무런 가치가 없지만 모델 레이어에서 접미어를 제거하려면 ActiveRecord를 원숭이 패치해야합니다. 모두 원숭이 패치 ActiveRecord 관계를 싫어합니다.

컨트롤러 레이어에서 어때요?

@comment = Comment.new(attributify(:comment)) 

# snip 

# ApplicationController 

def attributify() 
    # Now I'll go and write this! 
end 

편집 : 완료 : 컨트롤러 믹스는 여기에 있습니다 : https://gist.github.com/johncant/6056036

관련 문제