2012-09-05 2 views
1

node() 메소드를 사용하여 RABL에 자식 노드를 만들면 어떻게 표시 속성을 제어 할 수 있습니까?RABL - 자식 노드 내의 속성

json으로 출력은 이것이다 :

[ 
    { 
     "location": { 
      "latitude": 33333, 
      "longitude": 44444, 
      "address": "xxxxxxx", 
      "title": "yyyy", 
      "url": "http://www.google.com", 
      "rate": { 
       "created_at": "2012-09-02T11:13:13Z", 
       "id": 1, 
       "location_id": 1, 
       "pair": "zzzzzz", 
       "updated_at": "2012-09-02T12:55:28Z", 
       "value": 1.5643 
      } 
     } 
    } 
] 

내가 created_at, updated_at 제거하고 싶은 속성을 location_id.

collection @locations 
attributes :latitude, :longitude, :address, :title, :url 
node (:rate) do 
    |location| location.rates.where(:pair => @pair).first 
end 

가 나는 부분과 '확장'방법을 사용했지만, 그것은 완전히 일을 망쳐 :

내보기 파일이 있습니다. 또한 블록에 속성을 추가하려고 시도했지만 작동하지 않았습니다. 출력은 속성에 지정된대로 수행되었지만 각 속성의 값은 표시되지 않았습니다.

감사합니다.

답변

1

코드 : location.rates.where(:pair => @pair).first은 Rate 객체 전체를 반환합니다. 당신이 (예 : 모든 등 create_at, updated_at, 제외) 특정 필드를 원하는 경우 수동으로

기술 노드에서 해시() :

node (:rate) do |location| 
    loc = location.rates.where(:pair => @pair).first 
    { :pair => loc.pair, :value => loc.value, etc... } 
end 

또는 다음 두 가지 옵션이 있습니다

node (:rate) do |location| 
    location.rates.where(:pair => @pair).select('pair, value, etc...').first 
end 

을 ... 그리고 보조 노트로, 내가보기에 로직 (rates.where)를 배치하는 것이 가장 좋은 방법은 아니라고 말해야한다 :이을 할 수 있습니다. 컨트롤러가 Rate 모델을 사용하여 뷰에 대해이를 수행 할 수 있는지 확인하십시오.

+0

고마워 ... 나는 결국 '수동'해결책을 가지고 갔다. 뷰에서이 논리를 수행하는 이유는 각 Location 객체를 검토하고 속도를 조회 한 다음 두 가지를 모두 출력해야한다는 것입니다. 컨트롤러에서이 작업을 수행하려고 생각했지만 너무 복잡한 것처럼 보였습니다 (각 위치 및 해당 요금을 유지할 수있는 새로운 객체를 만드는 것이 포함될 것 같음). 그래서보기를 단순하게하기로 결정했습니다. – Imme22009

1

노드 블록 내에 attributes을 사용할 수 없습니다. "self"는 여전히 루트 객체 또는 컬렉션이므로 @locations입니다.

에서 :

node :rate do |location| 
    rate = location.rates.where(:pair => @pair).first 
    {:id => rate.id, :location_id => rate.location_id, :value => rate.value} 
end 

또한 부분을 사용하여 접근을 시도 할 수 있습니다 : 당신은 단순히 단지에 관심이있는 속성을 나열하여 사용자 정의 응답을 만들 수있는 노드 블록에서 또한 RABL wiki: Tips and tricks (When to use Child and Node)

를 참조하십시오 당신의 @locations의 rabl보기에서 다음 app/views/rates/show.json.rabl

object @rate 
attributes :id, :location_id, :value 

:

node :rate do |location| 
    rate = location.rates.where(:pair => @pair).first 
    partial("rates/show", :object => rate) 
end 
+0

감사합니다 .... 부분적으로 사용하는 방법을 시도했지만 작동하지 않았습니다. – Imme22009

+0

정말요? 나에게도 똑같은 접근 방식이 적용된다. 당신이 얻고있는 오류는 무엇입니까? –