3

我有一个 rake 任务,它会在一天中发送玩家活动的每日摘要电子邮件。(请参阅下面的示例代码。)如果我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_forhttp://apidock.com/rails/v4.1.8/ActionView/Helpers/UrlHelper/url_for - 注意 4.0.2 下的巨大红色减号) . 如果您查看源代码,您会看到我看到的错误 - 它不再需要选项。据我所知,该功能仍然存在于其他url_fors 中,例如ActionDispatch::Routing::UrlFor. 此外,错误消息建议包括Rails.application.routes.url_helpers.

我试过的

  • include ActionDispatch::Routing::UrlFor在 rake 任务(任务内部)和邮件程序中(同时,并且分别)
  • include Rails.application.routes.url_helpers在相同的位置和配置中,无论是否UrlFor包含包含。

错误仍然存​​在。ActionView::Helpers::UrlHelper我的猜测是,页面视图仍然坚持使用url_for. 我不认为我可以在视图中包含实际的东西(即使我可以,这看起来也很草率而且很老套)。

示例代码 (高度消毒)

配置/环境/development.rb:

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

lib/tasks/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 文件中还有一个模型 Player,resources :players以及一个与 Player 关联的 PlayerActivity 类。

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

帮助!

4

1 回答 1

0

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

<% @activites.each do |activity| %>
    Player: <%= link_to activity.player.name, player_url(activity.player) %>
<% end %>
于 2015-08-11T22:05:56.590 回答