2017-01-15 7 views
0

プレゼンター間でメソッドを再利用するための規約は何ですか?例えばプレゼンター間でメソッドを再利用する従来の方法は何ですか?

、アプリは以下のプレゼンター

class UserPresenter < BasePresenter 
end 
class AdminPresenter < BasePresenter 
end 
class EventPresenter < BasePresenter 
end 

ユーザーと管理者は、両方のアバターを持ってい言います。ユーザーと管理者のプレゼンターの間でavatarメソッドを共有する正しい方法は何ですか?

一つの解決策は、この単純な例ではOK働くAvatarPresenter

class UserPresenter < AvatarPresenter 
end 
class AdminPresenter < AvatarPresenter 
end 
class EventPresenter < BasePresenter 
end 
class AvatarPresenter < BasePresenter 
end 

から継承される可能性があります。しかし、将来的に状況がさらに複雑になる場合(たとえば、管理者とイベントの間で共有される追加の方法)はどうでしょうか。

私はプレゼンターの間で懸念を共有しようとしていると思います。これは従来のアプローチですか、もしそうなら、テンプレート実装はどのように見えますか?すべての私の試みはエラーmethod not foundを起こしています。

+0

おそらくモジュールはあなたが後にしているものです。 – meagar

答えて

4

あなたが探しているものはtraitsです。 Rubyでは、これはモジュールミックスインの形を取ります。

module Avatar 
    def self.included(base) 
    base.extend ClassMethods 
    base.class_eval do 
     # in this block you are operating on the singleton class 
     # where the module is included 
    end 
    end 

    def an_instance_method_from_avatar 
    end 

    module ClassMethods 
    def a_class_method_from_avatar 
    end 
    end 
end 

class UserPresenter 
    include Avatar 
end 

class AdminPresenter 
    include Avatar 
end 

これにより、さまざまな方法で構成できる再利用可能なコンポーネントを作成できます。 ActiveSupport::Concernは、上記のパターンを取り、それを簡素化:一方

module Avatar 
    # modules can be extended by other modules 
    extend ActiveSupport::Concern 

    included do 
    # in this block you are operating on the singleton class 
    # where the module is included 
    end 

    class_methods do 
    def a_class_method_from_avatar 
    end 
    end 

    def an_instance_method_from_avatar 
    end 
end 

継承(ベースクラス)のオブジェクトは、その親の真のサブタイプがある場合にのみ、実際に使用されるべきです。 AdminPresenterがアバターを持つプレゼンターであると主張できますが、他の機能を追加する必要がある場合は、実際に複雑なクラス図が表示されます。

+0

これは本当にRubyのあらゆる種類のオブジェクトに適用され、プレゼンターだけではありません。感謝@max。 – max

+0

。あなたはRailsアプリでプレゼンターの特質/モジュールをどこに見つけるのでしょうか? 'app/presenters/modules'ですか? 'app/traits'?このためのコンベンションはありますか? –

+0

最後の段落を正しく理解しましたか? "継承は...使用すべきです"。これはあなたの答えに記述するモジュールではなく、 'UserPresenter

関連する問題