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. Я не думаю, что могу включать вещи на самом деле в представления (что выглядит неряшливо и хакерски, даже если бы я мог).

Пример кода (сильно очищенный)

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.

Помощь!


person gailbear    schedule 12.12.2014    source источник


Ответы (1)


Пробовали ли вы передавать только своего игрока в URL-адресе? Так:

<% @activites.each do |activity| %>
    Player: <%= link_to activity.player.name, player_url(activity.player) %>
<% end %>
person Diego Senott    schedule 11.08.2015