【发布时间】:2011-11-02 03:57:14
【问题描述】:
这可能是一个愚蠢的问题,但是当我在 Rails 中整理 HTML 电子邮件时,是否有一种特别简单的内置方法可以在浏览器中预览模板,或者我是否需要编写某种自定义控制器把它作为它的视图?
【问题讨论】:
-
显然没有愚蠢的问题:D
标签: ruby-on-rails email
这可能是一个愚蠢的问题,但是当我在 Rails 中整理 HTML 电子邮件时,是否有一种特别简单的内置方法可以在浏览器中预览模板,或者我是否需要编写某种自定义控制器把它作为它的视图?
【问题讨论】:
标签: ruby-on-rails email
Action Mailer 现在有一个内置的previewing emails in 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
【讨论】:
spec/mailers/previews
Daniel 的answer 是一个好的开始,但如果您的电子邮件模板包含任何动态数据,它将无法正常工作。例如。假设您的电子邮件是订单收据,并在其中打印出@order.total_price - 使用前面的方法,@order 变量将为 nil。
这是我使用的一个小食谱:
首先,由于此电子邮件预览功能绝对仅供内部使用,因此我在 admin 命名空间中设置了一些通用路由:
#routes.rb
MySite::Application.routes.draw do
namespace :admin do
match 'mailer(/:action(/:id(.:format)))' => 'mailer#:action'
end
end
接下来,我创建控制器。在这个控制器中,我为每个电子邮件模板创建一个方法。由于大多数电子邮件包含动态数据,我们需要填充模板期望的任何成员变量。
这可以通过固定装置来完成,但我通常更喜欢只抓取一些伪随机真实数据。请记住——这不是一个单元测试——这纯粹是一个开发辅助。它不需要每次都产生相同的结果 - 事实上 - 如果不这样做可能会更好!
#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。这会将您的电子邮件正文嵌入到您创建的 HTML 电子邮件布局中,而不是典型的 Web 应用程序布局中(例如 application.html.erb)。
差不多就是这样。现在我可以访问http://example.com/admin/mailer/preview_welcome 预览对我的欢迎电子邮件模板的更改。
【讨论】:
get 'mailer...,而不是match。
37Signals 也有自己的邮件测试 gem,名为 mail_view。真是太棒了。
【讨论】:
我见过的最简单的设置是MailCatcher。设置需要 2 分钟,它适用于开箱即用的新邮件。
【讨论】:
我使用email_preview。试试看吧。
【讨论】:
我很惊讶没有人提到letter_opener。每当在 dev 中发送电子邮件时,它都会以浏览器页面的形式呈现和打开电子邮件。
【讨论】:
我最近编写了一个名为 Maily 的 gem,用于通过浏览器预览、编辑(模板文件)和发送应用程序电子邮件。它还提供了一种友好的数据挂钩方式、灵活的授权系统和极简的 UI。
我计划在不久的将来添加新功能,例如:
希望对你有帮助。
【讨论】:
如果您使用rails g mailer CustomMailer,rails 会生成邮件预览。
您将在spec/mailers/previews 文件夹中获得一个文件CustomMailerPreview。
您可以在这里编写调用邮件程序并生成预览的方法。
前-
class CustomMailerPreview < ActionMailer::Preview
def contact_us_mail_preview
CustomMailer.my_mail(user: User.first)
end
end
【讨论】:
config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
您可以使用Rails Email Preview
REP 是一个用于预览和测试发送电子邮件的 Rails 引擎,具有 I18n 支持、简单的 premailer 集成以及可选的 CMS 编辑与comfortable_mexican_sofa。
【讨论】:
无法直接从 Mailer 中预览它。 但正如您所写,您可以编写一个控制器,看起来像这样。
class EmailPreviewsControllers < ActionController::Base
def show
render "#{params[:mailer]}_mailer/#{params[:method]}"
end
end
但我认为,如果电子邮件看起来正确,那并不是测试电子邮件的最佳方法。
【讨论】:
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer' 会将电子邮件正文嵌入到您为应用创建的 HTML 电子邮件布局中。
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” 这个 crates mailer_previews 文件夹在 app 目录中。
生成器将为您的每封电子邮件添加一个存根,然后您使用模拟数据填充存根。
例如:
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) 搜索查询中的参数将作为实例变量用于预览类。例如:如果我们有一个类似的 URL
“/emails/user_mailer_preview-welcome?user_id=1” @user_id 定义在 UserMailerPreview 的欢迎方法中,它可以帮助我们向特定用户发送邮件。
class UserMailerPreview
def welcome
user = @user_id ? User.find(@user_id) : mock_user
UserMailer.welcome(user)
end
end
5) 像这样访问 REP 网址
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 Blog : Previewing Emails in Rails Applications With the Mail_View Gem
【讨论】:
rails 6 中最简单的解决方案:只需记住一个 url:
【讨论】:
我更喜欢mails_viewer gem。这个 gem 非常有用,因为它将 HTML 模板保存到 tmp 文件夹中。
【讨论】: