メーリングリスト機能を追加しているレールアプリがあります。私はahoy_email(0.3.0)とmailkick(0.1.4)の2つの宝石を統合しようとしており、エラーはSystemStackError: stack level too deep
になっています。Railsアプリケーションでmailkickとahoy_emailを統合するとSystemStackErrorが発生する
メーラーコードは単純です:
class AdminMailer < ApplicationMailer
# ...
def generated_recommendations(recommendations)
@recommendations = recommendations
mail(subject: "Recommendations generated for #{Date.today.strftime("%Y-%m-%d")}")
end
end
それがクラッシュする前に、スタックトレースは次のようになります。
--> #0 Mailkick::Mailer.mail(headers#Hash, &block#NilClass) at /home/mike/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mailkick-0.1.4/lib/mailkick/mailer.rb:4
#1 AhoyEmail::Mailer.mail_with_ahoy(headers#Hash, &block#NilClass) at /home/mike/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/ahoy_email-0.3.0/lib/ahoy_email/mailer.rb:27
#2 Mailkick::Mailer.mail(headers#Hash, &block#NilClass) at /home/mike/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mailkick-0.1.4/lib/mailkick/mailer.rb:4
#3 AhoyEmail::Mailer.mail_with_ahoy(headers#Hash, &block#NilClass) at /home/mike/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/ahoy_email-0.3.0/lib/ahoy_email/mailer.rb:27
#4 Mailkick::Mailer.mail(headers#Hash, &block#NilClass) at /home/mike/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mailkick-0.1.4/lib/mailkick/mailer.rb:4
それぞれの宝石は、他にmail
メソッドを呼び出します(またはmail_with_ahoy
のように見えますalias_method_chain呼び出しのためAhoyEmailで、下記を参照してください)。私は2個の宝石が追加
module AhoyEmail
module Mailer
def self.included(base)
base.extend ClassMethods
base.class_eval do
# ...
alias_method_chain :mail, :ahoy
end
end
module ClassMethods
# ...
def mail_with_ahoy(headers = {}, &block)
# this mimics what original method does
return message if @_mail_was_called && headers.blank? && !block
message = mail_without_ahoy(headers, &block) # *** This calls Mailkick::Mailer.mail
AhoyEmail::Processor.new(message, self).process
message
end
end
end
に
(***参照)module Mailkick
module Mailer
def mail(headers = {}, &block)
message = super # *** This ends up calling AhoyEmail::Mailer.mail_with_ahoy
Mailkick::Processor.new(message).process
message
end
end
end
と関連AhoyEmailコードは(***行を参照)byebugと関連Mailkickコードでそれを介して行われ、トレースこれらの機能は少し違った、AhoyEmailの場合、それは経由です:
ActionMailer::Base.send :include, AhoyEmail::Mailer
とMailkickの場合、それは経由です:
ActionMailer::Base.send(:prepend, Mailkick::Mailer)
私には宝石だけが矛盾しているように見えます(両者はよく一緒に遊ばないActionMailer::Base.mail
に変更を加えているので)、明らかな回避策はありません。 MailkickがAhoy電子メールのReadmeで参照されて以来、私は驚いていました。どのような助けが大いに感謝!