2016-05-10 6 views
1

メーリングリスト機能を追加しているレールアプリがあります。私は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で参照されて以来、私は驚いていました。どのような助けが大いに感謝!

答えて

0

私が使用していた宝石のahoy_email(RubyGemsから)のバージョンが、この問題を解決するためgithubで更新されていたことが判明しました。 : https://github.com/ankane/ahoy_email/issues/61

はこれが解決されるahoy_email宝石でdiffがここにある:ここではgithubの上の関連する問題を参照してください

gem 'ahoy_email', github: 'ankane/ahoy_email'

:ソリューションは、へGemfileで更新され、対応する行にしましたhttps://github.com/ankane/ahoy_email/commit/9416ab989b942cd556d09380f9072c260c2d6551

alias_method_chainの使用がなくなり、Module#prependに置き換えられました。ちょっと見ると、alias_method_chainはRails 5で廃止される予定です(https://github.com/rails/rails/pull/19434参照)。

編集2016年5月12日:宝石の新バージョン(0.3.1)は今、この修正プログラムをリリースされた私は、私にGemfileを更新しました: gem 'ahoy_email', '>= 0.3.1'

関連する問題