은 다음과 다형성의 관계를 사람의레일 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 클래스에 컨트롤러 조치를 도입하여 해당 정보를 표시하는 것입니다. 갤러리는 위의 액션 대신이 액션에 연결되어야하며 액션은 사진을 렌더링해야합니다.
그러나 표시 할 해당 정보가 각 클래스에 대해 고유 한 동작을 수행하는 데 약간만 있다고 느낍니다. 어쩌면 도우미로 충분할 수도 있지만 올바른 접근법이 확실하지 않습니다 (위의 가정이 사실이라면 올바르게 수정하십시오). 동물과 사람의 차이는 별도의 컨트롤러를 정당화하지 않는 경우
새로운 유형의 부착 가능한보기를 확장하는 더 좋은 방법이 될 수 있기 때문에이 솔루션을 수행하는 데있어 두 번째 생각이있었습니다. 그러나 각각의 컨트롤러에 대해 별도의 컨트롤러를 도입하는 대신 모든 부착 가능 장치에 대해 다형성 경로를 갖는 우아함을 유지합니다. 감사! – nbancajas