2017-06-28 3 views
1

以下は私の懸念事項であるコントローラのConcerns::V1::PlanFindingです。これが正常に実行さrailsコントローラにアクションのみを含む懸念モジュールを含める方法

class Dist::PlansController 
    include ::Concerns::V1::PlanFinding 

baseコントローラとアクションに応じて、それは以下のset_plan

extend ActiveSupport::Concern 
    attr_accessor :plan, :custom_key 

    included do |base| 
    actions = case base.to_s 
       when "Api::V1::PlansController" 
       [:show, :total_prices, :update] 
       when "Dist::PlansController" 
       [:show, :total_prices, :flight_info] 
       end 

    if actions.present? 
     before_action :set_plan, only: actions 
    else 
     before_action :set_plan 
    end 
    end 

    def set_plan 
    @plan = Model.find('xxx') 
    @custom_key = params[:custom_key] || SecureRandom.hex(10) 
    end 

を呼び出すことは、私からの懸念を呼ぶ一方のコントローラです。問題コードはコントローラbaseであまりにも多く貼り付けられています。

私の質問はコントローラの下にあるonlyオプションを使用できないためです。含めるための私自身のonlyオプションを実装するために、または懸念からbaseコントローラを分離するための新しい方法を見つける方法:

include Concerns::V1::PlanFinding, only: [:show] 

答えて

1

私の知る限り、これは箱の外には不可能です。私は、次のアプローチを使用します。

PLAN_FINDING_USE = [:show] 
include Concerns::V1::PlanFinding 

included do |base| 
    actions = base.const_defined?('PLAN_FINDING_USE') && 
      base.const_get('PLAN_FINDING_USE') 

    if actions.is_a?(Array) 
    before_action :set_plan, only: actions 
    else 
    before_action :set_plan 
    end 
end 
関連する問題