rake task和action_mailer.default_url_options

时间:2018-02-07 17:55:09

标签: ruby-on-rails ruby ruby-on-rails-5 rake rake-task

当我尝试从rake任务中使用ActionMailer时,我收到此错误:

  

ActionView :: Template ::错误:缺少要链接的主机!请提供:host参数,set default_url_options[:host]set :only_path为true

在我的development.rb我有以下一行:

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

此外,如果我输入development.rb这个:

config.action_mailer.default_url_options[:host] = 'localhost:3000'

rake任务工作正常,但服务器崩溃了:

  

config / environments / development.rb:20:in in block in':undefined method [] ='for nil:NilClass(NoMethodError)

如果我这样做:

config.action_mailer.default_url_options = {}
config.action_mailer.default_url_options[:host] = 'localhost:3000

rake任务不再起作用。

我很困惑,有什么建议吗?

UPD 我不认为代码会有所帮助,但就在这里,就是这么简单:

rake任务:

 task :send_newsletter => :environment do
    Receiver.all.each { |receiver|
      NewsletterMailer.newsletter(receiver).deliver
    }
  end

邮件收发器:

  def newsletter(receiver)
    @receiver = receiver

    mail(to: receiver.email, subject: "newsletter") do |format|
          format.html 
    end
  end

以及带有一些link_to xxx_url行的视图,显然导致了错误

ruby​​版本2.4.1

rails 5.1.3

rake 12.0.0(但也尝试了12.3.0没有区别)

2 个答案:

答案 0 :(得分:0)

尝试以下操作

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

<强>更新

我不知道这是什么理想的解决方案?但我已经测试了它并且它为我工作

Rails.application.routes.default_url_options = config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

这也有效

Rails.application.routes.default_url_options = Rails.application.config.action_mailer.default_url_options

此解决方案基于此link

另一个是

Rails.application.routes.default_url_options[:host] = '???'

这可以在每个环境文件中进行 - development.rbtest.rbproduction.rb(如果有的话,还有更多),每个环境文件中都有相应的主机名

Based Link

希望它会有所帮助

答案 1 :(得分:0)

解决了这条线添加到rake任务。基于fool-dev's回答

Rails.application.routes.default_url_options = Rails.application.config.action_mailer.default_url_options