Railsでメールをプレビューするにはどうすればよいですか?


116

これは馬鹿げた質問かもしれませんが、RailsでHTMLメールを組み立てるときに、ブラウザでテンプレートをプレビューする組み込みの簡単な方法はありますか、それをプルするカスタムコントローラのようなものを記述する必要がありますかその見方で?


2
どうやら馬鹿げた質問はありません:D
knagode

回答:


133

Action Mailerには、Rails 4.1で電子メールプレビューするための組み込みの方法があります。たとえば、これをチェックしてください:

# located in test/mailers/previews/notifier_mailer_preview.rb

class NotifierPreview < ActionMailer::Preview
  # Accessible from http://localhost:3000/rails/mailers/notifier/welcome
  def welcome
    Notifier.welcome(User.first)
  end
end

5
@andresこれは仕様によるものです。ユーザーに本番サーバーでメールをプレビューさせたくないので、ローカルでの開発のみを目的としています。
2015年

1
@mpoweredまた、ユーザーが送信しようとしているメールをプレビュー/変更できるようにするにはどうすればよいですか?(例:マネージャーがユーザーの申請を拒否し、申請者に警告するメールが送信されます)
Cyril Duchon-Doris

2
@CyrilDDあなたは自分でそのようなものを構築しなければならないでしょう、私はこれがその仕事のためのツールになるとは思いません。
benjaminjosephw 2015

1

8
Rspecを使用している場合、プレビューが表示されますspec/mailers/previews
Drew Stephens

73

ダニエルの答えは良い出発点ですが、メールテンプレートに動的データが含まれている場合、それは機能しません。たとえば、電子メールが注文の領収書であり、その中に印刷するとします。@order.total_price前の方法を使用すると、@order変数はnilになります。

ここに私が使用する小さなレシピがあります:

まず、このメールプレビュー機能は間違いなく内部使用のみであるため、いくつかの一般的なルートを管理名前空間に設定しました。

#routes.rb

MySite::Application.routes.draw do
  namespace :admin do
    match 'mailer(/:action(/:id(.:format)))' => 'mailer#:action'
  end
end

次に、コントローラーを作成します。このコントローラーでは、メールテンプレートごとに1つのメソッドを作成します。ほとんどのメールには動的なデータが含まれているため、テンプレートが想定するすべてのメンバー変数を設定する必要があります。

これはフィクスチャを使用して実行できますが、私は通常、いくつかの疑似ランダムな実際のデータを取得することを好みます。覚えておいてください-これは単体テストではありません-これは純粋に開発援助です。毎回同じ結果を生成する必要はありません-実際-そうでない場合はおそらくより良いです!

#app/controllers/admin/mailer_controller.rb
class Admin::MailerController < Admin::ApplicationController

  def preview_welcome()
    @user = User.last
    render :file => 'mailer/welcome.html.erb', :layout => 'mailer'
  end

end

テンプレートをレンダリングするときは、を使用することに注意してくださいlayout=>:mailer。これにより、通常のWebアプリケーションレイアウト(などapplication.html.erb)内ではなく、作成したHTMLメールレイアウト内にメールの本文が埋め込まれます。

そして、それだけです。これで、http://example.com/admin/mailer/preview_welcomeにアクセスして、ウェルカムメールテンプレートの変更をプレビューできます。


これは実際、私がとったアプローチであり、私があなたの答えを読み始めたときにコーディングしたところです-ありがとうございました:)
Peter Nixey

正解です。まさに私が必要としたもの!
クルガー

今ではおいしいレシピです!すばらしい答えをありがとう!
Rob Cooper

これは素晴らしい答えです!ありがとうございました!
OzBandit

5
ルートはのget 'mailer...代わりになりましたmatch
Patrick Berkeley、

18

37signalsのはとも呼ばれる、独自のメールテストの宝石があるmail_viewを。それはかなり素晴らしいです。


問題ない。どうやって使い始めたのですか?
マルク・

私がこれを投稿したとき、私は自分で書いたカスタムコントローラーで問題を解決しましたが、すぐにまたヒットするので、これを試して
みる予定です

16

私が見た中で最も簡単なセットアップはMailCatcherです。セットアップには2分かかりましたが、そのままの状態で新しいメーラーで動作します。


これは確かに素晴らしいです。設定は非常に速く、すべてのメーラーで機能します!すばらしいヒントです。
2016


5

私は最近、ブラウザを介してアプリケーションのメールをプレビュー、編集(テンプレートファイル)、配信するためにMailyという名前の宝石を書きました。また、データをフックするフレンドリーな方法、柔軟な認証システム、および最小限のUIも提供します。

近い将来、次のような新機能を追加する予定です。

  • メールごとに複数のフック
  • UIを介してメールをパラメーター化する(メーラーメソッドの引数)
  • 翻訳キーを使って遊ぶ(リスト、ハイライトなど)

お役に立てれば幸いです。


4

Rails Email Previewを使用できます

rails-email-previewスクリーンショット

REPは、I18nサポート、簡単なプリメーラーの統合、およびcomfortable_mexican_sofaを使用したオプションのCMS編集で、送信メールをプレビューおよびテストするためのRailsエンジンです。


REPとCMSの統合を実際に行う方法のサンプルはありますか?
danieldekay 2014年

デモアプリケーションは知りませんが、包括的な記事がwikiにあります
glebm

4

railsを使用すると、メールプレビューが生成されますrails g mailer CustomMailer。あなたはCustomMailerPreview中にファイルを取得しますspec/mailers/previewsフォルダます。

ここで、メーラーを呼び出すメソッドを記述して、プレビューを生成します。

元-

class CustomMailerPreview < ActionMailer::Preview
  def contact_us_mail_preview
    CustomMailer.my_mail(user: User.first)
  end
end

すべてのメールをhttp:// localhost:3000 / rails / mailers / custom_mailerでプレビューします


私が追加したrspecを使用した私のアプリ config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
Mauro

3

Rails Email Previewを使用すると、開発モードのWebブラウザーで電子メールをすばやく表示できます。

1)“gem ‘rails_email_preview’, ‘~> 0.2.29’ “gemファイルに追加し、バンドルをインストールします。

2)実行 “rails g rails_email_preview:install”これをすると、configフォルダーに初期化子が作成され、ルートが追加されます。

3)“rails g rails_email_preview:update_previews”アプリディレクトリのこのクレートmailer_previewsフォルダーを実行します。

ジェネレータは各メールにスタブを追加し、スタブにモックデータを入力します。

例:

class UserMailerPreview
def invitation
UserMailer.invitation mock_user(‘Alice’), mock_user(‘Bob’)
end
def welcome
UserMailer.welcome mock_user
end
private
def mock_user(name = Bill Gates’)
fake_id User.new(name: name, email: user#{rand 100}@test.com”)
end
def fake_id(obj)
obj.define_singleton_method(:id) { 123 + rand(100) }
obj
end
end

4)検索クエリのパラメーターは、クラスをプレビューするためのインスタンス変数として使用できます。例:“/emails/user_mailer_preview-welcome?user_id=1” @user_idWelcomeメソッドで定義されているようなURLがある場合 UserMailerPreview、特定のユーザーにメールを送信するのに役立ちます。

class UserMailerPreview
def welcome
user = @user_id ? User.find(@user_id) : mock_user
UserMailer.welcome(user)
end
end

5)このようなREP URLにアクセスするには

rails_email_preview.rep_root_url
rails_email_preview.rep_emails_url
rails_email_preview.rep_email_url(‘user_mailer-welcome’)

6)REP経由でメールを送信できます。これは環境メーラー設定を使用します。イニシャライザのこの行のコメントを外して、テスト環境でのメール送信を無効にします。

config.enable_send_email = false

ソース:RailsCarmaブログ:Mail_View Gemを使用したRailsアプリケーションでのメールのプレビュー


3

誰も言及していないletter_openerに驚いています。これは、メールが開発者に配信されるたびに、メールをブラウザーページとしてレンダリングして開く宝石です。


1
letter_openerはかっこいい宝石であり、必需品です。ただし、メールが純粋にメールのhtml / cssをチェックするために再生したくない特別なイベントからメールが開始する場合があります。
Mauro

2

メーラーから直接プレビューする方法はありません。しかし、あなたが書いたように、あなたはこのようなものに見えるコントローラーを書くことができます。

class EmailPreviewsControllers < ActionController::Base
  def show
    render "#{params[:mailer]}_mailer/#{params[:method]}"
  end
end

しかし、メールが正しく見える場合、それがメールをテストする最良の方法ではないと思います。


3
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer'アプリ用に作成したHTMLメールレイアウト内にメールの本文を埋め込みます。
デクスター、2011

それをありがとう-私はブラウザの互換性をダブルチェックしたくありません、私はそれを別々に扱います、私はただそれを素早く吐き出して、それがどのように見えるかを見たいだけです-あなたのアプローチはそのためにうまくいくと思います
Peter Nixey

1

私はmails_viewer gem を好みます。この宝石は、HTMLテンプレートをtmpフォルダーに保存するので非常に便利です。

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