1

은 다음과 다형성의 관계를 사람의레일 3 다형성 협회,보기 페이지

class Person 
    has_many :photos, :as => :attachable 
end 

class Animal 
    has_many :photos, :as => :attachable 
end 

class Photo 
    belongs_to :attachable, :polymorphic => true 
end 

뷰 페이지를 고려한다 동물 개체는 해당 사진의 갤러리가 포함되어 있습니다.

... 
    <%= link_to(image_tag(photo.image_url(:thumb).to_s), [@attachable, photo]) %> 
... 

그러나 내 사진의 뷰 페이지에서, 나는 그것이 사람 또는 동물에 속하는지 여부에 따라 다른 정보를 제공 할 : 페이지는 다음과 같은 코드가 포함되어 있습니다. 예를 들어, 사람 인 경우 애완 동물의 높이, 목록을 표시해야합니다. 동물 인 경우 품종, 소유자 등을 표시해야합니다.

가장 적합한 해결책은 무엇입니까? 나는 두 가지 솔루션의

을 생각할 수 있습니다 :

한 가지 방법은 각 클래스의 사진에 별도의 컨트롤러 액션에 지시 할 수 있습니다.

<%= link_to(image_tag(photo.image_url(:thumb).to_s), show_person_path[@attachable, photo]) %> 
<%= link_to(image_tag(photo.image_url(:thumb).to_s), show_animal_path[@attachable, photo]) %> 

같은 뭔가 그러나 나는이 방법은 다형성 클래스 뷰 로직의 부적절한 위임을 소개합니다 생각합니다.

또 다른 접근법은 각 Person 및 Animal 클래스에 컨트롤러 조치를 도입하여 해당 정보를 표시하는 것입니다. 갤러리는 위의 액션 대신이 액션에 연결되어야하며 액션은 사진을 렌더링해야합니다.

그러나 표시 할 해당 정보가 각 클래스에 대해 고유 한 동작을 수행하는 데 약간만 있다고 느낍니다. 어쩌면 도우미로 충분할 수도 있지만 올바른 접근법이 확실하지 않습니다 (위의 가정이 사실이라면 올바르게 수정하십시오). 동물과 사람의 차이는 별도의 컨트롤러를 정당화하지 않는 경우

답변

2

, 당신은 하나의 컨트롤러를 가질 수 및 갤러리의 행동에, 당신의 @attachable의 종류에 따라 서로 다른 견해를 렌더링 :

if @attachable.is_a? Person 
    render 'gallery_person' 
elsif @attachable.is_a? Animal 
    render 'gallery_animal' 
end 

여기에서 볼 수있는 단점은 새로운 유형의 부착 형을 도입 할 때마다 돌아와서 논리를 확장해야한다는 것입니다. 기본 갤러리보기를 추가하여이를 완화 할 수 있습니다.

+0

새로운 유형의 부착 가능한보기를 확장하는 더 좋은 방법이 될 수 있기 때문에이 솔루션을 수행하는 데있어 두 번째 생각이있었습니다. 그러나 각각의 컨트롤러에 대해 별도의 컨트롤러를 도입하는 대신 모든 부착 가능 장치에 대해 다형성 경로를 갖는 우아함을 유지합니다. 감사! – nbancajas