url_for в электронном письме, отправленном задачей rake в rails 4
У меня есть грабли, которая рассылает ежедневные дайджесты по электронной почте об активности игроков в течение дня. (См. Пример кода ниже.) Если я бегу 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
, Я не думаю, что на самом деле могу включить вещи в представления (которые выглядят неаккуратными и хакерскими, даже если бы я мог).
Пример кода(сильно санированный)
конфиг /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 %>
У меня также есть модель Player, resources :players
в моем файле rout.rb и классе PlayerActivity со связью с Player.
В настоящее время я использую (действительно ужасающий) обходной путь @base_url = Rails.configuration.action_mailer.default_url_options[:host]
в моем почтовом действии и "http://#{@base_url}/players/#{activity.player.id}"
на мой взгляд, вместо player_url.
Помогите!
1 ответ
Вы пытались передать только ваш игрок в URL? Как это:
<% @activites.each do |activity| %>
Player: <%= link_to activity.player.name, player_url(activity.player) %>
<% end %>