我有一个 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_for
(http://apidock.com/rails/v4.1.8/ActionView/Helpers/UrlHelper/url_for - 注意 4.0.2 下的巨大红色减号) . 如果您查看源代码,您会看到我看到的错误 - 它不再需要选项。据我所知,该功能仍然存在于其他url_for
s 中,例如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 部分。
帮助!