web-dev-qa-db-ja.com

Rails 4.1メーラーのプレビューとカスタムメールの作成

新しいRails 4.1.1アプリでDeviseメールをカスタマイズしています。新しいRailsメールプレビュー機能に表示させたいだから私は次のことをしました:

1)config/development.rbファイルに次のスニペットを追加しました:

config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"

2)app/mailers/user_mailer.rbにカスタムのDeviseメールUserMailerを作成しました:

class UserMailer < Devise::Mailer   
  helper :application # gives access to all helpers defined within `application_helper`.
  include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url`

  layout "notifications_mailer"
end

3)config/initializers/devise.rbを次のスニペットを含むように変更しました:

config.mailer = 'UserMailer'

4)クラスUserMailerPreviewlib/mailer_previewsに以下の内容で追加しました:

class UserMailerPreview < ActionMailer::Preview
  def confirmation_instructions
    UserMailer.confirmation_instructions(User.first, {})
  end

  def reset_password_instructions
    UserMailer.reset_password_instructions(User.first, {})
  end

  def unlock_instructions
    UserMailer.unlock_instructions(User.first, {})
  end
end

ここまでは順調ですね。私はすべてを正しく行ったようです。しかし、/ Rails/mailers/user_mailer/confirmation_instructionsルートでconfirmation_instructionsメールのプレビューを表示しようとすると、次のエラーが発生します。

undefined method `confirmation_url' for #<#<Class:0x007fa02ab808e0>:0x007fa030fb7e80>

confirmation_url.html.erbテンプレートのコードは次のようになります。

<%= t("notifications.texts.greeting") + @user.display_name %>,

<p>You can confirm your account email through the link below:</p>

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token =>  @token) %></p>

何が悪いのですか? confirmation_urlメソッドを呼び出す方法に問題があると思います。誰でもここで私を助けることができますか?

35

この質問を見つけたのは、自分でDeviseメールをプレビューする方法を見つけようとしていたためです。私はあなたのコードをほぼ正確にコピーしました、そしてそれは私にとってはうまくいきます。

異なる方法で行った唯一のことは、_UserMailerからlayout "notifications_mailer"の行を削除することでした。これを含めると、Missing template layouts/notifications_mailerというエラーメッセージが表示されました。削除するとどうなりますか?

Devise::Controllers::UrlHelpersの行には、確実にメソッドconfirmation_urlが含まれています(Railsコンソールを開いてinclude Devise::Controllers::UrlHelpersを実行してからconfirmation_urlを実行すると、これを確認できます。そのため、プレビューがレンダリングされていないことが問題だと思いますUserMailerによるものです。理由はわかりませんが、layout "notifications_mailer"という行が原因である可能性があります。

NotificationsMailerというクラスはありますか?そこにDevise::Controllers::UrlHelpersを含めると問題が解決しますか?

5
GMA

カスタムメーラーを使用せずにDeviseメールをプレビューする場合(ただし、カスタムメール)は、次のようにしました。

  1. メールプレビュー用にアプリを構成します。

  2. Devise Mailer Previewクラスを設定する

    a。 Rails〜> 4.1

    # mailer/previews/devise_mailer_preview.rb
    class Devise::MailerPreview < ActionMailer::Preview
    
      def confirmation_instructions
        Devise::Mailer.confirmation_instructions(User.first, "faketoken")
      end
    
      def reset_password_instructions
        Devise::Mailer.reset_password_instructions(User.first, "faketoken")
      end
    
      ...
    
    end
    

    b。 Rails〜> 5.0

    class DeviseMailerPreview < ActionMailer::Preview
    
      ... # same setup as Rails 4 above
    
  3. サーバーを再起動します

51
steel

Rails 5を使用すると、@ steelの優れた回答とは少し異なる構文が見つかりました。二重の "::"の使用が違いです:

# Preview all emails at http://localhost:3000/Rails/mailers/devise_mailer
class DeviseMailerPreview < ActionMailer::Preview

    def reset_password_instructions
        Devise::Mailer.reset_password_instructions(User.first, "faketoken")
    end
end
6
eaton9000

モデルに必要なdeviseモジュールを含めることを忘れた場合は、devise urlヘルパーの未定義のメソッドを取得します。例えばモデルがUserであり、confirmation_url:confirmableモジュールが含まれています:

devise <...snipped...>, :confirmable

このモジュールが現在読み込まれている場合読み込まれていない場合、アプリケーションで使用されていない可能性が高いことに注意してください。確認!

:confirmableモジュールを含めると、すべてのユーザーがロックアウトされる可能性があります。 https://github.com/plataformatec/devise/wiki/How-To:-Add-:confirmable-to-Users を参照してください

6
Zabba