Rails 来自单独模块的邮件程序参数错误

Rails mailer argument error from separate module

在我的应用程序中,我有一个支持页面,可以在其中发送电子邮件以寻求支持:P。同样在我的应用程序中,我有一个用于发出请求的模块

#lib/requester.rb
module Requester

  def post(rel_url, body, token = nil, headers = {})
    request(:post, rel_url, body, token, headers)
  end

  def request(method, rel_url, body = nil, token = nil, additional_headers = {})
    headers = { 'Content-Type': 'application/json' }
    headers[:Authorization] = "Bearer #{token}" if token
    headers.merge!(additional_headers) unless additional_headers.empty?

    HTTParty.send(method.to_sym, "#{base_url}#{rel_url}", headers: headers, body: body)
  end
end

我的邮件程序在这里抛出一个错误,但问题是,它根本就不是 call/include/invoke 模块。以下是在控制器中调用邮件程序的方式:


  def send_tech_support_email
    support_mailer.send_tech_support_email.deliver_later
  end

  def support_mailer
    SupportMailer
      .with(
        user: current_api_user_profile,
        description: notify_params[:description].to_s
      )
  end

还有邮寄方法

  def send_tech_support_email
    defaults

    mail(
      to: ENV['SUPPORT_TECH_EMAIL'],
      subject: 'Support Request',
      template_name: 'send_support_email'
    )
  end

如您所见,它没有调用请求者模块中的任何方法。任何人都知道可能导致这种情况的原因是什么?错误是

wrong number of arguments (given 0, expected 2..5)\n/path/to/local_app/lib/requester.rb:25:in 'request'

使用 delayed_job 作为队列适配器。同样,当使用 deliver_now 时,它可以正常工作。只是在后台发送的时候才弹出错误,导致邮件无法发送

看起来您的控制器可能包含您的 Requester 模块。这将覆盖一个名为 request 的核心 Rails 方法。根据回溯,失败来自 this line:

# ActionView::Helpers::ControllerHelper
@_request = controller.request if controller.respond_to?(:request)

request 是控制器可用的特殊方法。您需要在您的控制器中不包含 Requester,重命名您的 request 方法,或者将您的 request 方法移动到您可以调用它的地方,而无需将其包含在控制器本身中。

您可能需要检查您的控制器继承自什么。如果它类似于 ApplicationController,那么可能包括 Requester.

如果您暂时将此代码放入控制器操作中,它将显示包含模块的所有祖先 类:

raise self.class.ancestors.select { |ancestor| ancestor.include?(Requester) }.map(&:name).join(', ')