从模块内调用实例方法

时间:2012-12-03 00:14:11

标签: ruby-on-rails ruby ruby-on-rails-3 inheritance

我已经在几个ActionMailer实例中反复调用了几个方法,并且我想将它们移动到一个模块中,以便我可以将它们作为一个组包含在内并干掉它们。

module SendgridSettings
 open_tracking true
 add_filter_setting("subscriptiontrack", "enable", 1)
 add_filter_setting("subscriptiontrack","replace","{{ unsubscribe_url }}")
 uniq_args({'id' => email.id, 'organization_id' => organization.id})
 substitute '{{ person.first_name }}', recipients
 set_credentials(organization)
end

以下是相关的邮件代码:

class NewChargeMailer < ActionMailer::Base
  def charge_email(recipient, transaction, organization)
  include SendgridSettings

我收到错误undefined method open_tracking&#39;对于SendgridSettings:Module`,因为它似乎是在模块上应用方法,而不是包含它的对象。

我在网上看到的大多数例子都是关于在模块中定义方法,然后在继承对象中使用它们。我想我正试图做相反的事情,并且还没有找到办法做到这一点。这样的事情有可能,甚至是个好主意吗?我并不习惯使用模块,它似乎是分离需要有时作为一个组调用的方法的自然方式。

1 个答案:

答案 0 :(得分:2)

您可能需要执行以下操作:

module SendgridSettings

  def self.included(base)
    base.class_eval do
      before_filter :default_settings
    end
  end

  def default_settings
    #write your code here
  end

end

此代码也可能在模块内部工作:

::ActionMailer::Base.register_interceptor(self)

您也可以像控制器一样使用ActionMailer:

module ActionMailer
  class Base < AbstractController::Base
    #...
  end
end

来源: Rails 3: Trying to extend Action Mailer with a module https://github.com/weppos/actionmailer_with_request/blob/master/lib/actionmailer_with_request.rb http://railsdispatch.com/posts/actionmailer