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(', ')
在我的应用程序中,我有一个支持页面,可以在其中发送电子邮件以寻求支持: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(', ')