2017-04-10 4 views
0

私はこのロジックを以下に示します。 2つのコントローラは、同じロジックをアクション内に持っています。 common_logic1 common_logic2 common_logic3、私は共通のロジックを分離したいが、それを行う方法は分かっていない。一般的なロジックをコントローラから分離する最も良い方法は何ですか

class ServicesController < ApplicationController 
    ... 
    def download 
    some_logic_for_services 
    common_logic1 
    common_logic2 
    common_logic3 
    end 
    ... 
end 

class PackagesController < ApplicationController 
    ... 
    def download 
    some_logic_for_packages 
    common_logic1 
    common_logic2 
    common_logic3 
    end 
    ... 
end 

第1の方法は、ApplicationControllerにメソッドを作成し、それを継承することです。 しかし、私はこの方法が太いapplicationControllerの最後に行くと思う。

class ApplicationController < ActionController::Base 
    ... 
    def common_logic 
    common_logic1 
    common_logic2 
    common_logic3 
    end 
    ... 
end 

class ServicesController < ApplicationController 
    ... 
    def download 
    some_logic_for_services 
    common_logic 
    end 
    ... 
end 

class PackagesController < ApplicationController 
    ... 
    def download 
    some_logic_for_packages 
    common_logic 
    end 
    ... 
end 

第2の方法は、ロジックをヘルパーモジュールに分けて含めることです。しかし、私はヘルパーが論理から見解を分離することだと思います。

module CommonHelper 
    ... 
    def common_logic 
    common_logic1 
    common_logic2 
    common_logic3 
    end 
    ... 
end 

class ServicesController < ApplicationController 
    include CommonHelper 
    ... 
    def download 
    some_logic_for_services 
    common_logic 
    end 
    ... 
end 

class PackagesController < ApplicationController 
    include CommonHelper 
    ... 
    def download 
    some_logic_for_packages 
    common_logic 
    end 
    ... 
end 

activesupportの::懸念にロジックを分離する第三の方法は、と私は、この選択は、この場合で最高だと思います。

module Commonable 
    extend ActiveSupport::Concern 
    ... 
    def common_logic 
    common_logic1 
    common_logic2 
    common_logic3 
    end 
    ... 
end 

class ServicesController < ApplicationController 
    include Commonable 
    ... 
    def download 
    some_logic_for_services 
    common_logic 
    end 
    ... 
end 

class PackagesController < ApplicationController 
    include Commonable 
    ... 
    def download 
    some_logic_for_packages 
    common_logic 
    end 
    ... 
end 

誰かが私にこれら3つの方法の賛否両論を教えてもらえますか?解決策があればpleseが教えてくれます。ありがとうございました。

答えて

1

Railsの方法はActiveSupport::Concernです。 ApplicationControllerにも含めることができます。

場合によっては、サービス方法を使用することができます。ロジックが1つのことを実行する場合、別のクラスに移動することができます。 たとえば、ユーザーの残高を確認し、否定的かどうかを通知するコードを共有しています。

の場合は、コントローラでクラスCheckUserBalance

class CheckUserBalance 
    def initialization(user) 
    @user = user 
    end 

    def call 
    unless @user.balance < 0 
     #notify about negative balance and change user's status 
    end 
    end 
end 

を作成し、我々はこのサービスを呼び出すapplication.rb

にautoload_pathに追加することの必要性、 app/servicesフォルダ内のすべてのサービスを維持するために

config.autoload_paths += %W(#{config.root}/lib #{config.root}/app/services)

を好みます。

CheckUserBalance.new(current_user).call 
+0

ありがとうございます。 ActiveSupport :: ConcernとService Layerを使用する状況は何ですか。どのように区別するのですか? –

+0

サービス層はビジネスロジック用です。サービスクラスは、コントローラ、モデル、またはレーキタスクで使用できます。コードにコントローラに関連するメソッド(リダイレクト、パラメータ...)がある場合は、ActiveSupport :: Concernを使用します。 –

関連する問題