У меня есть рейк-таск, который рассылает ежедневные дайджесты активности игроков в течение дня. (См. пример кода ниже.) Если я запускаю 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
. Я не думаю, что могу включать вещи на самом деле в представления (что выглядит неряшливо и хакерски, даже если бы я мог).
Пример кода (сильно очищенный)
config/environtments/development.rb:
config.action_mailer.default_url_options = { host: 'localhost:3000' }
библиотека/задачи/player.rake:
namespace :player do
task :activity => :environment do
PlayerActivityMailer.activity_report.deliver
end
end
app/mailers/player_activity_mailer.rb:
class PlayerActivityMailer < ActionMailer::Base
def activity_report
@activities = PlayerActivity.all
mail(to: '[email protected]', subject: 'activity report')
end
end
app/views/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
в моем файле route.rb, и класс PlayerActivity со связью с Player.
В настоящее время я использую (действительно ужасающий) обходной путь @base_url = Rails.configuration.action_mailer.default_url_options[:host]
в моем почтовом действии и "http://#{@base_url}/players/#{activity.player.id}"
в моем представлении вместо части player_url.
Помощь!