1

我有几个方法我在几个 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 methodSendgridSettings:Module 的错误 open_tracking',因为它似乎是在模块上应用方法,而不是在包含它的对象上。

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

4

1 回答 1

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:尝试使用模块扩展 Action Mailer https://github.com/weppos/actionmailer_with_request/blob/master/lib/actionmailer_with_request.rb http://railsdispatch.com/posts/actionmailer

于 2012-12-03T00:30:38.127 回答