簡體   English   中英

Ruby模塊中的訪問控制器方法

[英]Access controller method in a Ruby module

在我的Rails應用程序中,有一個我需要在模塊中使用的ApplicationController中定義的方法。 該模塊還需要所有控制器/助手都可訪問。 我不確定最好的方法是使模塊訪問此方法。 我認為有一種方法可以通過包裝模塊,然后將其包含到ApplicationController中來實現。

我還想保留命名空間,而不是將模塊方法直接包含在控制器中。 例如controller.Module.foo而不是controller.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

現在,我知道可以在Analytics模塊中添加self.included方法,該方法為我傳遞了傳入的基礎對象,但是我不知道如何在KissMetrics模塊中利用該基礎。

這可能嗎,還是有更好的方法呢?

編輯:

為了進一步闡明,我使用的是一個擴展/包含在ActionController :: Base中的gem。 請參閱此腳本的底部。 然后在ApplicationController內部配置該庫。 我要做的就是擁有一個帶有定義事件的模塊,該模塊利用了這個gem。 這使我更容易在所有控制器上進行一致的事件,例如

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"

就我所知,您不應從lib中調用控制器動作,而應從相反的角度進行。

我建議制作一個庫,因為我不知道您到底要構建什么,所以我建立了一個示例:

在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

決定通過將模塊更改為類並在ApplicationController的before_filter回調中對其進行實例化來解決此問題。 我將初始化的分析對象傳遞給它,一切都很好。 本來希望使用模塊,但這可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM