首页 文章

Rails 4.1 Mailer预览和设计自定义电子邮件

提问于
浏览
27

我有一个全新的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)将 UserMailerPreview 类添加到 lib/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 方法的方式有问题 . 有人可以帮我吗?

4 回答

  • 5

    我发现了这个问题,因为我试图弄清楚如何自己预览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 的 class 吗?包括 Devise::Controllers::UrlHelpers 在那里解决你的问题?

  • 40

    对于那些想要在不使用自定义邮件程序的情况下预览Devise电子邮件的人(但仍然是自定义电子邮件),这就是我所做的(在Rails> = 4.1中工作):

    • 配置您的应用以进行电子邮件预览 .

    • 设置Devise Mailer Preview类

    # 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
    
    • 重启服务器
  • 5

    使用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

    当您忘记在模型中包含必要的设计模块时,您将获得设计URL助手的未定义方法 . 例如如果您的模型是 User 并且您想要 confirmation_url ,则必须确保包含 :confirmable 模块:

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

相关问题