2009-06-15 11 views
0

私は信じられないほど似ているいくつかのオブジェクトを持っています。実際には、STIを使用して、DB内のすべてのデータを同じテーブルに格納します。現在、私が機能を追加したり、バグを修正するたびに、私は3つの異なる場所でそれを更新しなければならないので、私は少しコードを削除したいと思います。最も一般的なコードの複製はビューにあります。私はrender :template => 'shared/something'を使って人々が共通の見解を描写しているのを見ましたが、問題は、私はこれらの多くを持っていますが、特定のオブジェクト(貨物)についてのみです。もっと重要なのは、実際のクラスのいずれかがテンプレートを必要に応じてオーバーライドできるようにすることです。Rails - Abstract/Shared Views

これについてはどのようにすればいいですか?どんな答えでもありがとう!

答えて

1

inherit_viewsプラグインがジョブを実行する可能性があります。http://github.com/ianwhite/inherit_views/tree/master私はそれを以前にうまく使用しました。

出荷をレンダリングする必要のあるすべてのコントローラに対して共通の基本コントローラクラスを用意し、個々のコントローラのビューフォルダ内の特定のオーバーライドを持つベースコントローラのviewsフォルダに共通のテンプレートを持つことができます。

+0

おかげで、これはまさに私が必要なもののように見えます! –

0

クラス(少なくともモデル)は、どのように表示されているかについて何も知っていません。これは、MVCパターンによって提供される懸念の分離にとって基本的なことです。

は、すべてのSTIモデル、同様のShipmentsControllerか何かのために単一のコントローラを使用します。

は、私はこのような何かをしようと思います。それを論理的にすることは別として、あなたの意見はすべて同じ場所で終わるでしょう。それは助けてくれるはずです。

ビューについては、共通部分の「メイン」と、サブクラス固有のフィールドの各セットの部分についてはどうですか?

あなたがのための部分的なを持っている
<%= render :partial => @shipment.class.name.downcase, :locals => { :item => @shipment } %> 

:(Railsは規則を愛して)規則を使用して検討し、あなたのビューでcase、またはおそらくよりきれいに、ヘルパーメソッド、ドライヤー

def partial_name_for_subclass(obj) 
    if obj.is_a?(CrudeOilShipment) # or kind_of? or test the type column or use respond_to? 
    'crude_oil_shipment' 
    # etc 
    end 
end 

のようなものを使用します各サブクラス。

期待してのいくつかは助け/理にかなって...