2012-06-26 1 views
3

UserProject, Suggestion, Comment 또는 다른 객체를 좋아할 수있는 데이터 모델이 있습니다. 우리가다형성 모델로 RABL 부분을 렌더링하십시오.

object @like 
attributes :id, :created_at, :target_type, :target_id, :user_id 
child :user => :user do 
    extends "users/show" 
end 
child :target do 
    node do |project| 
    partial('projects/show', :object => project) 
    end 
end 

그러나, 나뿐만 아니라 target_type에 따라 suggestions/show, comments/show의 부분 지문을 사용할 수 있도록 할 Project 자녀를 지원하기 만한다면 모델은 likes/show.rabl 작품을 올바르게 설정하고있다.

나는 이것을 시도했지만 작동하지 않습니다 :
child :target do |u| 
    u.target.map do |r| 
    if r.is_a?(Suggestion) 
     partial("suggestions/show", :object => r) 
    elsif r.is_a?(Project) 
     partial("projects/show", :object => r) 
    end 
    end 
end 

내가 undefined method target for <Rabl::Engine:0x69fb988>를 얻을. 그러나 첫 번째 경우에는이 오류가 발생하지 않습니다. 어떤 아이디어?

답변

3

partial 대신 extends을 사용해 보셨습니까?

아마도이 같은 것을 시도해 볼 수 있습니까? 당신이 객체 r 끝까지 반복의 범위에 이미이기 때문에이 경우

child :target do |u| 
    u.target.map do |r| 
    if r.is_a?(Suggestion) 
     extends "suggestions/show" 
    elsif r.is_a?(Project) 
     extends "projects/show" 
    end 
    end 
end 

, 당신은 extends 사용할 때, 당신은 :object에 전달할 필요가 없습니다.

3

이것은 내가 결국 사용을 끝내고 작동했습니다. 이 게시물에 대한

감사합니다 : 가능한 모든 다형성 관계를 나열 할 수없는 경우,이 작업을 수행하는 또 다른 방법이있다 https://github.com/nesquena/rabl/issues/273#issuecomment-6580713

child :target do 
    node do |r| 
    if r.is_a?(Suggestion) 
     partial("suggestions/show", :object => r) 
    elsif r.is_a?(Project) 
     partial("projects/show", :object => r) 
    end 
    end 
end 
1

. 조금 해킹 될지도 모르지만 작동합니다. 이처럼

는 :

child :target do |u| 
    # The regexp snippet selects everything from the last/and to the end 
    extends u.to_partial_path.gsub(/\/([^\/]+)$/, '/show') 
end 

이 개체의 .to_partial_path을 사용합니다. 개체의 이름이 Suggestion 인 경우 .to_partial_pathsuggestions/suggestion을 반환합니다. 이것이 내가 다음에 오는 것을 대체하기 위해 gsub()/show으로 사용하는 이유입니다.

이 솔루션을 사용하면 다른 다형성 관계를 추가 할 때마다이 파일을 업데이트 할 필요가 없습니다. 새 오브젝트에 show.json.rabl

이라는 템플릿이 있는지 확인하면됩니다.