1

次のポリモーフィックな関係を考えてみましょう

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クラスにコントローラーアクションを導入して、対応する情報を表示することです。ギャラリーは上記のアクションではなくこのアクションにリンクする必要があり、アクションは写真をレンダリングする必要があります。

しかし、表示される対応する情報は、クラスごとに独自のアクションに値するものはほんのわずかしかないように感じます。ヘルパーで十分かもしれませんが、正しいアプローチがわかりません(上記の仮定が正しい場合は訂正してください)。

4

1 に答える 1

2

動物と人の違いが別のコントローラーを正当化しない場合は、1つのコントローラーを使用して、ギャラリーのアクションで、@attachableのタイプに基づいて異なるビューをレンダリングすることができます。

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

ここで私が見る唯一の欠点は、新しいタイプのアタッチ可能ファイルを導入するたびに、戻ってロジックを拡張する必要があることです。これを軽減するために、デフォルトのギャラリービューを追加できます。

于 2012-05-07T10:58:49.543 に答える