1

Capistrano 3.7.2,Rails 5.0.2和Ruby 2.4.0是特定的。使用Rails 5,Ruby 2.4和Capistrano 3在Capistrano部署期间发送电子邮件3

** Execute load:defaults 
cap aborted! 
NameError: uninitialized constant ActiveSupport::Rescuable 
/Users/username/.rvm/gems/ruby-2.4.0/gems/actionmailer-5.0.2/lib/action_mailer/rescuable.rb:6:in `<module:Rescuable>' 
/Users/username/.rvm/gems/ruby-2.4.0/gems/actionmailer-5.0.2/lib/action_mailer/rescuable.rb:4:in `<module:ActionMailer>' 
/Users/username/.rvm/gems/ruby-2.4.0/gems/actionmailer-5.0.2/lib/action_mailer/rescuable.rb:1:in `<top (required)>' 
/Users/username/.rvm/gems/ruby-2.4.0/gems/actionmailer-5.0.2/lib/action_mailer/base.rb:8:in `require' 
/Users/username/.rvm/gems/ruby-2.4.0/gems/actionmailer-5.0.2/lib/action_mailer/base.rb:8:in `<top (required)>' 
/Users/username/rails_5_test_app/config/deploy/notify/cap_mailer.rb:5:in `require' 
/Users/username/rails_5_test_app/config/deploy/notify/cap_mailer.rb:5:in `<top (required)>' 
config/deploy.rb:4:in `require' 
config/deploy.rb:4:in `<top (required)>' 
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/lib/capistrano/setup.rb:27:in `load' 
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/lib/capistrano/setup.rb:27:in `block (3 levels) in <top (required)>' 
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/lib/capistrano/configuration/variables.rb:32:in `untrusted!' 
/Users/username/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/delegate.rb:83:in `method_missing' 
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/lib/capistrano/setup.rb:26:in `block (2 levels) in <top (required)>' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/task.rb:250:in `block in execute' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/task.rb:250:in `each' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/task.rb:250:in `execute' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/task.rb:194:in `block in invoke_with_call_chain' 
/Users/username/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/task.rb:187:in `invoke_with_call_chain' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/task.rb:180:in `invoke' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/application.rb:152:in `invoke_task' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/application.rb:108:in `block (2 levels) in top_level' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/application.rb:108:in `each' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/application.rb:108:in `block in top_level' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/application.rb:117:in `run_with_threads' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/application.rb:102:in `top_level' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/application.rb:80:in `block in run' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/application.rb:178:in `standard_exception_handling' 
/Users/username/.rvm/gems/[email protected]/gems/rake-12.0.0/lib/rake/application.rb:77:in `run' 
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/lib/capistrano/application.rb:14:in `run' 
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/bin/cap:3:in `<top (required)>' 
/Users/username/.rvm/gems/ruby-2.4.0/bin/cap:22:in `load' 
/Users/username/.rvm/gems/ruby-2.4.0/bin/cap:22:in `<main>' 
/Users/username/.rvm/gems/ruby-2.4.0/bin/ruby_executable_hooks:15:in `eval' 
/Users/username/.rvm/gems/ruby-2.4.0/bin/ruby_executable_hooks:15:in `<main>' 
Tasks: TOP => staging 

我即将开始升级我的Rails应用4到Rails 5,并决定做一个小的测试应用程序,以确保我所有的宝石都工作:Execute load:defaults后,我得到的错误发生。一切都很好,除了自从Rails 2在Capistrano部署期间发送电子邮件以来我一直使用的代码之外,当我尝试要求或加载邮件程序代码时导致此错误; deploy.rb的第4行是要求。如果我对此发表评论并设置标志不发送电子邮件,则部署工作完美。

的邮件代码(基于关闭的东西通过MislavMarohnić年发布前):

cap_mailer.rb:

require "action_mailer" 

yaml_config = File.read("config/email.yml") 
email_config = YAML.load(yaml_config) 
ActionMailer::Base.delivery_method = email_config['delivery_method'] # currently set to :smtp 
ActionMailer::Base.smtp_settings = { 
    address: email_config['smtp_settings']['address'], 
    port: email_config['smtp_settings']['port'], 
    notify_emails: email_config['notify_emails'] 
} 
ActionMailer::Base.view_paths = File.dirname(__FILE__) 

class CapMailer < ActionMailer::Base 
    default :from => 'App Deployment <[email protected]>' 

    def deploy_notification(cap_vars) 
    @now = Time.now 

    set :body, ENV['comment'] 

    mail(:to => fetch(:notify_emails), 
     :subject => "#{fetch(:human_readable_application_name)} - Changes to application on #{fetch(:stage)} server at #{fetch(:host)}" 
    ) 
    end 

    def test_email 
    @now = Time.now 

    mail(:to => "[email protected]", 
     :subject => "#{fetch(:human_readable_application_name)} - Capistrano test email #{@now.strftime("on %m/%d/%Y at %I:%M %p")}" 
    ) 

    end 

end 

我能挖网上都引用非常类似的邮件设置窗口(例如https://gist.github.com/johnthethird/955917),它们是针对所有事情的旧版本编写的。在卡皮斯特拉诺部署期间,有几封宝石用于发送邮件,但它们与真的很旧(capistrano-notifier,capistrano_mailer)的问题相同。

所以在这一点上我卡住了。谷歌搜索NameError: uninitialized constant ActiveSupport::Rescuable建议也许这是一个配置问题,但我不知道该找什么。在我的Rails安装中有ActiveSupport :: Rescuable IS;我仔细检查。任何想法,将不胜感激。

回答

2

看起来你需要加载的ActiveSupport第一,像这样:

require "active_support" 
require "action_mailer" 
+0

那完美。你能解释为什么这是必要的吗?和/或为什么只有在Rails 5中才有必要?我以前没有遇到过这样的事情。 – Maltiriel

+1

好吧,根据错误,ActionMailer依赖于'ActiveSupport :: Rescuable',但它显然不会自己加载它。这看起来像是ActionMailer 5.0.2的一个监督(bug),我会在Rails GitHub上报告它。 –