1

は、以下の多型の関係のRails 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]) %> 
... 

は、しかし、私の写真のビューページでは、私はそれが人や動物に属しているかどうかに応じて異なる情報を提示したい: ページには、次のコードが含まれています。例えば、それが人物である場合、彼/彼女の身長、ペットのリストを表示する必要があります。動物の場合は、その品種、所有者などを表示する必要があります

これを行うには最適な解決策は何ですか?

私は2つの可能な解決策を考えることができます。

一つの方法は、各クラスのための写真の別のコントローラのアクションに向けることである可能性があります。

<%= 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]) %> 

よう 何かがしかし、私はこのアプローチはポリモーフィッククラスでビューロジックの不適切な代表団を紹介すると思います。

もう1つの方法は、それぞれのPersonクラスとAnimalクラスにコントローラアクションを導入して、対応する情報を表示する方法です。ギャラリーは上記のアクションの代わりにこのアクションにリンクし、アクションは写真をレンダリングする必要があります。

しかし、私は表示される対応する情報が各クラスのための独自のアクションに値する少数であるように感じる。たぶんヘルパーで十分ですが、私は正しいアプローチがわかりません(上記の前提が真であれば私を修正してください)。

答えて

2

動物と人との違いは、別のコントローラを正当化していない場合は、一方のコントローラを持っている可能性があり、ギャラリーのために行動して、ちょうどあなたの@attachableの種類に基づいて異なるビューをレンダリング:

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

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

+0

私は、新しいタイプのアタッチ可能なビューを拡張するより良い方法があると思っていたので、この解決策を実行する上で第二の考えがありました。しかし、それぞれのコントローラーを別々に導入するのではなく、すべてのアタッチテーブルの多形ルートを持つという優雅さを保ちます。ありがとう! – nbancajas