url_for在rails 4中由rake任务发送的电子邮件中

时间:2014-12-12 02:02:18

标签: ruby-on-rails-4 actionmailer rake-task url-for

我有一个佣金任务,可以在一天内发送玩家活动的每日摘要电子邮件。 (请参阅下面的示例代码。)如果我在控制台中运行PlayerActivityMailer.activity_report.deliver,一切正常。但是,当我尝试调用rake任务时,出现以下错误:

rake aborted!
ActionView::Template::Error: arguments passed to url_for can't be handled.
Please require routes or provide your own implementation

在做了一些研究后,我发现在Rails 4中,他们完全被ActionView::Helpers::UrlHelper.url_for http://apidock.com/rails/v4.1.8/ActionView/Helpers/UrlHelper/url_for { - 注意到4.0.2下的巨大红色减号。如果您查看来源,您可以看到我看到的错误 - 它不再需要选项。据我所知,该功能仍存在于其他url_for中,例如ActionDispatch::Routing::UrlFor中的功能。此外,错误消息建议包括Rails.application.routes.url_helpers

我尝试了什么

    rake任务(在任务内)和邮件程序(两者同时,每个单独)中的
  • include ActionDispatch::Routing::UrlFor
  • include Rails.application.routes.url_helpers在相同的地方和配置中,包括和不包含UrlFor

错误仍然存​​在。我的猜测是页面视图仍然坚持使用ActionView::Helpers::UrlHelperurl_for。我不认为我可以在视图中包含实际内容(即使我可以,这也是草率的外观和hacky)。

示例代码 (严重消毒)

配置/ environtments / development.rb:

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

LIB /任务/ player.rake:

namespace :player do
  task :activity => :environment do
    PlayerActivityMailer.activity_report.deliver
  end
end

应用程序/邮寄者/ player_activity_mailer.rb:

class PlayerActivityMailer < ActionMailer::Base
  def activity_report
    @activities = PlayerActivity.all
    mail(to: 'foo@bar.com', subject: 'activity report')
  end
end

应用程序/视图/ player_activity_mailer / activity_report.html.erb:

<% @activites.each do |activity| %>
    Player: <%= link_to activity.player.name, player_url(id: activity.player.id) %>
    ...
<% end %>

我的routes.rb文件中还有一个模型播放器resources :players,以及与播放器关联的PlayerActivity类。

我目前在我的邮件程序中使用@base_url = Rails.configuration.action_mailer.default_url_options[:host]的(非常可怕的)解决方法,而在我的视图中使用"http://#{@base_url}/players/#{activity.player.id}"而不是player_url部分。

帮助!

1 个答案:

答案 0 :(得分:0)

您是否尝试在网址中仅传递您的播放器?像这样:

<% @activites.each do |activity| %>
    Player: <%= link_to activity.player.name, player_url(activity.player) %>
<% end %>