这可能是一个愚蠢的问题,但是当我在Rails中整理HTML电子邮件时,是否有一种特别简单的内置方式可以在浏览器中预览模板,或者我是否需要编写某种自定义控制器它把它拉进去了吗?
答案 0 :(得分:119)
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
答案 1 :(得分:73)
Daniel的answer是一个好的开始,但如果您的电子邮件模板包含任何动态数据,它将无效。例如。假设您的电子邮件是订单收据,并且在其中打印出@order.total_price
- 使用之前的方法,@order
变量将为零。
这是我使用的一个小方法:
首先,由于此电子邮件预览功能绝对仅供内部使用,因此我在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预览对我的欢迎电子邮件模板的更改。
答案 2 :(得分:18)
37Signals也拥有自己的邮件测试宝石mail_view。这太棒了。
答案 3 :(得分:16)
我见过的最简单的设置是MailCatcher。安装花了2分钟,它适用于开箱即用的新邮件。
答案 4 :(得分:11)
我使用email_preview。试一试。
答案 5 :(得分:5)
我最近写了一个名为Maily的宝石来预览,编辑(模板文件)并通过浏览器发送应用程序电子邮件。它还提供了一种友好的方式来挂钩数据,灵活的授权系统和极简主义的用户界面。
我计划在不久的将来添加新功能,例如:
我希望它可以帮到你。
答案 6 :(得分:4)
您可以使用Rails Email Preview
REP是一个预览和测试发送电子邮件的rails引擎,支持I18n,简单的预编译器集成以及comfortable_mexican_sofa的可选CMS编辑。
答案 7 :(得分:3)
Rails电子邮件预览可帮助我们在开发模式下快速查看Web浏览器中的电子邮件。
1)将“gem ‘rails_email_preview’, ‘~> 0.2.29’ “
添加到gem文件并捆绑安装。
2)运行“rails g rails_email_preview:install”
这会在config文件夹中创建初始化程序并添加路由。
3)在app目录中运行“rails g rails_email_preview:update_previews”
此crates mailer_previews文件夹。
Generator会为每封电子邮件添加一个存根,然后用模拟数据填充存根。
例如:
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_id
在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 Blog : Previewing Emails in Rails Applications With the Mail_View Gem
答案 8 :(得分:3)
我很惊讶没有人提到letter_opener。每当电子邮件在开发中发送时,它都会以电子邮件的形式呈现和打开电子邮件。
答案 9 :(得分:3)
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
上的所有电子邮件
答案 10 :(得分:2)
无法直接从Mailer中预览它。 但正如你所写,你可以写一个控制器,看起来像这样。
class EmailPreviewsControllers < ActionController::Base
def show
render "#{params[:mailer]}_mailer/#{params[:method]}"
end
end
但我认为,如果它们看起来不正确,那么这不是测试电子邮件的最佳方式。
答案 11 :(得分:1)
我更喜欢mails_viewer宝石。这个gem非常有用,因为它将HTML模板保存到tmp文件夹中。
答案 12 :(得分:0)
rails 6 中最简单的解决方案:只记住一个 url: