ActionMailerビューでビューヘルパーを使用する方法


227

app/helpers/annotations_helper.rbReportMailerビューで定義したメソッドを使用したい(app/views/report_mailer/usage_report.text.html.erb)。どうすればよいですか?

このガイドに基づいて、add_template_helper(helper_module)メソッドは私が望むことをするように見えるかもしれませんが、それを使用する方法がわかりません。

(ところで、メーラービューで別のヘルパーセットにアクセスする理由はありますか?これはかなり面倒です。)


回答:


324

メールの管理に使用しているメーラークラスで:

class ReportMailer < ActionMailer::Base
  add_template_helper(AnnotationsHelper)

  ...
end

4
この場合は機能しません(Rails 3.2.8):ApplicationControllerにメソッドが定義されていて、helper_method:my_helper_wannabeによってそれをヘルパーにしていますが、「my_helper_wannabe」というメソッドがメーラーで使用できません。
Giang Nguyen

Railsの3で処理する方法については以下を参照してくださいデュークの答え
クリス・ピーターズ

Rails 3.2.11で動作
1

1
これらは自動的にRails 4に含まれるはずだと思いましたか? guides.rubyonrails.org/...
gabeodess

6
これは古くからの答えですが、これはRails 5.2で機能したと言っても過言ではありません
Archonic

158

Rails 3では、ActionMailerクラスの上部にあるヘルパーメソッドを使用するだけです。

helper :mail   # loads app/helpers/mail_helper.rb & includes MailHelper

1つのメーラーでのみ必要なので、ブロックを渡しました。

helper do
  def host_url_for(url_path)
    root_url.chop + url_path
  end
end

(必ずconfig.action_mailer.default_url_optionsを設定してください。)

(そしてurl_forを使用する場合は、必ず:only_path => falseを渡してください)


3
これは機能しますが、ApplicationControllerで既に定義されているヘルパーを個々のActionMailerクラスにも再指定するのは厄介です。ActionMailerはActionControllerを拡張するため、共通の階層から取得されます。ソリューションよりもRailsに関するコメントが多い...
robbie613

3
ヘルパーが名前空間にいる場合は、次のことができますhelper :'namespace/mail'
Jonathon Batson

ヘルパーが名前空間にある場合は、記号ではなく文字列のみも受け入れますhelper 'namespace/mail'
Pwnrar

2
Rails 5.2で動作します!
RousseauAlexandre

28

Rails 3のすべてのメーラー(「アプリケーション」ヘルパーを設定):

# config/application.rb:
...
config.to_prepare do
  ActionMailer::Base.helper "application"
end

共有メールのパーシャルの最良の答え。ありがとう!
Alexey Shein

2
真ではないhelper :application-Rails 4.2.1で正常に動作します。
ステーキチェイサー2015

の独自のメールテンプレートでも問題なく機能しますdevisehelper :applicationこの場合、機能しません。
Sven R.

1
4.2.5.1では動作しません- include ApplicationHelper動作しました
daslicious

23

Ruby on Rails 4では、次の2つのことを行う必要がありました。

(1)デュークがすでに言ったように、追加したいヘルパーがUsersHelperたとえばなら、追加します

helper :users

派生ActionMailerクラス(例app/mailers/user_mailer.rb

(2)その後、新しいエラーが発生しました:

ActionView::Template::Error (Missing host to link to! Please provide the :host
parameter, set default_url_options[:host], or set :only_path to true)

これを修正するには、次の行を追加します

config.action_mailer.default_url_options = { :host => 'localhost' }

config/environments/*.rbファイルに。の場合は、プロダクションヘルパーによって生成されたURLに適したホストconfig/environments/production.rbに置き換えlocalhostます。


Q:#2で、メールビューにこの情報が必要なのに、通常のビューには必要ないのはなぜですか?

A:host生成されたリンクはすべて、リンク先のホストから提供されるため、通常のビューはを知る必要はありません。メールに表示されるリンクは、同じホストから提供されません(にリンクしているhotmail.com場合gmail.comなど)。


合成名についてはどうですか?User::ComposedHelper
Cyril Duchon-Doris


17

(これは古い質問ですが、Railsは進化しているため、Rails 5.2で機能するものを共有します。)

通常は、HTMLだけでなく、電子メールの件名行を表示するときにカスタムビューヘルパーを使用することをお勧めします。次のように、ビューヘルパーがapp / helpers / application_helper.rbにある場合:

module ApplicationHelper

  def mydate(time, timezone)
    time.in_time_zone(timezone).strftime("%A %-d %B %Y")
  end

end

ヘルパーを使用する動的な電子メールの件名行とテンプレートを作成できますが、ここで2行目と3行目を見るとわかるように、apps / mailer / user_mailer.rbで2つの異なる方法でApplicationHelperを明示的に使用するようにRailsに指示する必要があります:

class UserMailer < ApplicationMailer

  include ApplicationHelper  # This enables me to use mydate in the subject line
  helper :application  # This enables me to use mydate in the email template (party_thanks.html.erb)

  def party_thanks
    @party = params[:party]
    mail(to: 'user@domain.com',
    subject: "Thanks for coming on #{mydate(@party.created_at, @party.timezone)}")
  end

end

これら2つの行も同様に機能するので、どちらか一方を選択してください。

helper :application

add_template_helper(ApplicationHelper)

FWIW、app / views / user_mailer / party_thanks.html.erbのメールテンプレートは次のようになります。

<p>
  Thanks for coming on <%= mydate(@party.created_at, @party.timezone) %>
</p>

そしてapp / controller / party_controller.rbコントローラーはこのようになります

class PartyController < ApplicationController
  ...
  def create
    ...
    UserMailer.with(party: @party).party_thanks.deliver_later
    ...
  end
end

私は非常に畳み込まれ、このすべての感触が与えられたことをOP(@Tomリーマン)と@gabeodessに同意する必要がhttps://guides.rubyonrails.org/action_mailer_basics.html#using-action-mailer-helpersので、おそらく、私は何かが欠けています。.. 。


5

Rails4の場合、私はこのようにします:

# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  add_template_helper ApplicationHelper
  ...
end

そして

# app/mailers/user_mailer.rb
class AccountMailer < ApplicationMailer
  def some_method(x, y)
  end
end

add_template_helperどこにでも指定する必要がないように。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.