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 %>
Другие вопросы по тегам