2011-09-20 6 views
4

에서 여러 개체를 respond_with하는 방법은 레일 3.1

POST /interaction.json 

클라이언트 게시물 새로운 상호 작용 예를

에 대한 경로를 가지고있다. 일반적으로 내 컨트롤러는

class InteractionController < ApplicationController 

    def create 
     respond_with @log 
    end 

end 

처럼 보일 것이고, 나는 JSON 응답

{ "log" : { "id" : 20, .... } } 

내가 더 많은 개체를 반환 할 경우

http://foo.com/log/20 

로 설정 위치 헤더를 다시 얻을 것이다 내 : json 응답은 @log보다 빠릅니다. 예를 들어 클라이언트에게이 상호 작용과 관련하여 어떤 점이 변경되었음을 알리는 것입니다. 아마도 사용자가이 상호 작용을 한 상을 수상했을 것입니다.

response_with @log, @prize 

을 할 수 있도록 친절하게하고 응답을

{ "log": { "id": 20, ... }, 
    "prize": { "id": 50, ...} 
} 

를 얻을 수 있지만 작동 respond_with 방법이 아니다 것입니다. @prize를 @log의 중첩 된 리소스로 취급합니다. 누구든지이 아이디어를 제안 할 수 있습니까?

답변

9

두 개의 독립적 인 개체를 병합하는 것은 위험하며 호출자의 기존 특성을 무시합니다.

대신 당신은 항상 객체를 래핑하고 대신 래퍼로 응답 할 수있다 :

@response = {:log => @log, :price => @price} 
respond_with @response 
1

@log@prize이 모두 해시라고 가정하면 merge 두 해시를 모두 수행하고 병합을 반환 할 수 있습니다.

respond_with @log.merge(@prize) 

나는 하지만 @prize.id@log.id를 덮어 쓸 수 있습니다 생각하고 있어요. 있다면 다른 것을 시도해 볼 수 있습니다.