1 日のプレイヤー アクティビティのダイジェスト メールを毎日送信するレーキ タスクがあります。(以下のコード例を参照してください。)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
rake タスク (タスク内) とメーラー (両方同時に、それぞれ個別に) の両方で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' }
lib/タスク/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: 'foo@bar.com', 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 %>
また、routes.rb ファイルにモデル Player があり、Player にresources :players
関連付けられた PlayerActivity クラスがあります。
私は現在、player_url 部分の代わりに@base_url = Rails.configuration.action_mailer.default_url_options[:host]
、メーラー アクションとビューで (本当に恐ろしい) 回避策を使用しています。"http://#{@base_url}/players/#{activity.player.id}"
ヘルプ!