我有一个佣金任务,可以在一天内发送玩家活动的每日摘要电子邮件。 (请参阅下面的示例代码。)如果我在控制台中运行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
。
我尝试了什么
include ActionDispatch::Routing::UrlFor
include Rails.application.routes.url_helpers
在相同的地方和配置中,包括和不包含UrlFor
。错误仍然存在。我的猜测是页面视图仍然坚持使用ActionView::Helpers::UrlHelper
版url_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部分。
帮助!
答案 0 :(得分:0)
您是否尝试在网址中仅传递您的播放器?像这样:
<% @activites.each do |activity| %>
Player: <%= link_to activity.player.name, player_url(activity.player) %>
<% end %>