1

私のRailsアプリには、モジュールで使用する必要のあるApplicationControllerで定義されたメソッドがあります。このモジュールは、すべてのコントローラー/ヘルパーがアクセスできる必要もあります。モジュールにこのメソッドへのアクセスを許可するのが最善の方法かわかりません。モジュールをラップしてからApplicationControllerに含めることでそれを行う方法があると思います。

また、モジュールメソッドをコントローラーに直接含めるのではなく、名前空間を保持したいと思います。例:controller.fooだけでなくcontroller.Module.foo

これが私がやろうとしていることです:

module Analytics
  module Events
    extend self

    def create_event name
      # do some stuff
      controller_method name
    end
  end
end

class ApplicationController < ActionController::Base
  include Analytics

  def controller_method
     # ...
  end

  def some_other_method
    Events.create_event :test
  end
end

これで、渡されたベースオブジェクトを提供するself.includedメソッドをAnalyticsモジュールに追加できることがわかりましたが、KissMetricsモジュールでそのベースをどのように利用できるかわかりません。

これは可能ですか、それともこれを行うためのより良い方法がありますか?

編集:

さらに明確にするために、ActionController::Baseに拡張/含まれているgemを使用しています。このスクリプトの下部を参照してください。次に、このライブラリはApplicationController内で構成されます。私がやりたいのは、この宝石を利用するイベントが定義されたモジュールを用意することだけです。これにより、すべてのコントローラーで一貫したイベントを簡単に実行できます。

module Events
  def sign_up_event
    analytical.event "sign up" # calls the library that was loaded into the app controller
  end
end

# in some controller
Events.sign_up_event
# instead of this, which is totally usable but not DRY
analytical.event "sign up"
4

2 に答える 2

0

私の知る限り、ライブラリからコントローラーアクションを呼び出すべきではありませんが、その逆です。

あなたが構築しようとしているものを正確に知らないので、ライブラリを作成することをお勧めします。例をセットアップしました:

lib/analytics.rb 内

class Analytics
  def initialize(object_id, event_id)
    # insert object to event relation logic here
    @object = Object.find(object_id)
    @event = Event.find(event_id)
  end

  def add_instance_method
    # add logic for instantiated Analytics object
    @object.event_collection.create(event_id: @event.id)
  end

  def self.check_class_method?(object_id, event_id)
    # check logic for Analytic Class taking 2 arguments
    @object = Object.find(object_id)
    @event = event.find(event_id)
    @object.events.include?(@event)
    # return true/false
  end
end

だから今あなたのコントローラーで:

def action
  @object = Object.find(params[:id])
  @event = Event.find_by_identifier("logged_in")

  unless Analytics.check_class_method?(@object_id, @event_id)
    analytic = Analytics.new(@object.id, @event.id)
    raise "Failed" unless analytic.add_instance_method
  end
end
于 2013-03-12T16:46:10.217 に答える
0

モジュールをクラスに変更し、ApplicationController の before_filter コールバックでインスタンス化することで、これを解決することにしました。初期化された分析オブジェクトを渡すと、すべて問題ありません。モジュールを使用することをお勧めしますが、これでうまくいきます。

于 2013-03-18T14:51:33.233 に答える