Rails 4.1 Mailer预览和设计自定义电子邮件
我有一个全新的Rails 4.1.1应用程序,我正在自定义Devise电子邮件。 我想让它们显示在新的Rails电子邮件预览function上,所以我做了以下事情:
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 #<#:0x007fa030fb7e80>
我的confirmation_url.html.erb
模板的代码如下所示:
, You can confirm your account email through the link below:
@token) %>
我究竟做错了什么? 我想我调用confirmation_url
方法的方式有问题。 有人可以帮我吗?
我发现了这个问题,因为我试图弄清楚如何自己预览Devise电子邮件。 我几乎完全复制了你的代码,它对我来说很好。
我做的唯一不同的是从UserMailer
删除行layout "notifications_mailer"
– 当我包含它时,我收到错误消息Missing template layouts/notifications_mailer
。 如果你删除会发生什么?
线Devise::Controllers::UrlHelpers
肯定包含方法confirmation_url
(你可以通过打开Rails控制台并运行include Devise::Controllers::UrlHelpers
然后confirmation_url
include Devise::Controllers::UrlHelpers
来看到这个,所以我怀疑问题是你的预览是不是完全由UserMailer
渲染。我不知道为什么,但是线路layout "notifications_mailer"
可能是罪魁祸首。
你有一个名为NotificationsMailer
的课程吗? 在那里包含Devise::Controllers::UrlHelpers
可以解决您的问题吗?
对于那些希望在不使用自定义邮件程序的情况下预览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
-
重启服务器
使用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
当您忘记在模型中包含必要的设计模块时,您将获得设计URL助手的未定义方法。 例如,如果您的模型是User
并且您想要confirmation_url
,则必须确保包含: :confirmable
模块:
devise <...snipped...>, :confirmable
- 从Rails 3中的application.js访问current_user变量
- Rails 4设计3.1.1 ActionController :: Devise中的UnknownFormat :: RegistrationsController #new
- 设备和ActiveResource
- 使用可确认设计 – 当用户尝试使用未经证实的电子邮件登录时,将用户重定向到自定义页面
- 在设备中的两个Web应用程序之间共享会话
- 新安装的Rails + Devise总是获得401 Unauthorized
- 在我的应用程序上使用Devise注销问题
- 在设计上设置ssl
- 在Ruby on Rails上为Devise设置不同的用户模型和注册路径