次のポリモーフィックな関係を考えてみましょう
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]) %>
...
しかし、私の写真の表示ページでは、それが人のものか動物のものかによって、異なる情報を提示したいと思います。たとえば、人物の場合は、身長、ペットのリストを表示する必要があります。動物の場合は、その品種、飼い主などを表示する必要があります。
これを行うための最良の解決策は何ですか?
私は2つの可能な解決策を考えることができます:
1つの方法は、クラスごとに写真の個別のコントローラーアクションを指示することです。何かのようなもの
<%= 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クラスにコントローラーアクションを導入して、対応する情報を表示することです。ギャラリーは上記のアクションではなくこのアクションにリンクする必要があり、アクションは写真をレンダリングする必要があります。
しかし、表示される対応する情報は、クラスごとに独自のアクションに値するものはほんのわずかしかないように感じます。ヘルパーで十分かもしれませんが、正しいアプローチがわかりません(上記の仮定が正しい場合は訂正してください)。