3

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::UrlForrake タスク (タスク内) とメーラー (両方同時に、それぞれ個別に) の両方で
  • 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}"

ヘルプ!

4

1 に答える 1

0

プレーヤーだけを URL に渡してみましたか? このような:

<% @activites.each do |activity| %>
    Player: <%= link_to activity.player.name, player_url(activity.player) %>
<% end %>
于 2015-08-11T22:05:56.590 に答える