web-dev-qa-db-ja.com

Rails非同期メーラーで画像の完全なURLを取得するにはどうすればよいですか?

ActionMailerで送信するメールに、アプリにリンクする画像を含めたいです。私の開発環境では、例えば:

<img src="http://myfullappurl.dev/assets/myimage.png">

私は私のdevelopment.rbにこれを持っています

config.action_controller.asset_Host = 'myfullappurl.dev'
config.action_mailer.asset_Host = config.action_controller.asset_Host
config.action_mailer.default_url_options = { Host: 'myfullappurl.dev', only_path: false }

しかし、メールテンプレートで次のいずれかの方法で完全なURLをレンダリングすることはできません。

asset_path('myimage.png')
asset_path('myimage.png', only_path: false)
image_url('myimage.png')

このトピックに関する同様の質問の多くは、次のようなことで答えられます。

"#{request.protocol}#{request.Host_with_port}#{asset_path('image.png')}"

ただし、メールはSidekiqで非同期に送信されるため、コントローラーで同期的に送信された場合のようなrequestオブジェクトはありません。

私が見逃している明らかなものはありますか、またはRailsこれを行うために戦う必要がありますか?私はRails 4を使用していますが、 3.1/3.2で機能するものはすべて問題なく動作します。

23
Chris Aitchison

これは奇妙な動作ですが、この問題は解決しました。 action_mailer.asset_Hostがhttp://で始まっていない限り、無視されることがわかりました。 actionpack/lib/action_view/helpers/asset_url_helper.rbには、有効なActionMailer URIを定義する正規表現があります。

URI_REGEXP = %r{^[-a-z]+://|^(?:cid|data):|^//}

ただし、http://action_controller.asset_Hostの前に配置すると、http://http://myfullappurl.devへのリンクが作成されます。

それを解決するには、次のコードをdevelopment.rbに追加する必要がありました。

 config.action_controller.asset_Host = 'myfullappurl.dev'
 config.action_mailer.asset_Host = 'http://myfullappurl.dev'

明確にするために、これはRails 4.0.0beta1であり、Sidekiqで非同期にメールが送信されます。これがRails 3.に影響するかどうかはわかりません。

44
Chris Aitchison

私はあなたがあなたの設定でこれらを設定する必要があると信じています

config.action_controller.asset_Host = 'http://localhost:3000' #Or your domain
config.action_mailer.asset_Host = config.action_controller.asset_Host
9
Josh Wilson

あなたの環境ファイル(つまり、development.rb)に:

config.action_mailer.asset_Host = 'http://localhost:3000' #Or your domain

メーラービューファイル:-

<%= image_tag('image_name.jpg') %>

または

<img src="<%= image_url('image.jpg') %>" %>
2
sahilbathla