如何在Sinatra应用中启用ActionMailer邮件预览功能?
解决Sinatra中ActionMailer预览功能的配置问题
1. 配置预览路径并加载预览文件
首先在Sinatra主应用文件(如app.rb)的开发环境配置块中,指定ActionMailer预览文件的存放路径,并确保文件能被正确加载:
configure :development do # 设置邮件预览文件目录 ActionMailer::Base.preview_path = File.expand_path('../../spec/companyname/mailers/previews', __FILE__) # 自动加载所有预览文件 Dir.glob("#{ActionMailer::Base.preview_path}/**/*.rb").each { |file| require file } end
2. 添加Sinatra路由处理预览请求
Sinatra没有内置/rails/mailers路由,需要手动添加路由来支持预览页面的访问,这里提供两种方案:
方案一:借助Rails路由集合(推荐)
引入Rails相关模块,挂载ActionMailer预览的原生路由:
require 'action_mailer/preview' require 'rails/controller' require 'action_dispatch/routing/route_set' # 初始化Rails路由集合 routes = ActionDispatch::Routing::RouteSet.new routes.draw do get '/rails/mailers' => 'rails/mailers#index' get '/rails/mailers/*path' => 'rails/mailers#preview' end # 在Sinatra应用中使用该路由集合 use routes
方案二:手动实现轻量路由
如果不想引入过多Rails依赖,可自行编写简单路由和视图:
# 预览列表页路由 get '/rails/mailers' do previews = ActionMailer::Preview.all_previews erb :mailer_previews_index, locals: { previews: previews } end # 单个邮件预览路由 get '/rails/mailers/:preview_class/:preview_method' do preview_class = params[:preview_class].camelize.constantize email = preview_class.new.send(params[:preview_method]) content_type email.mime_type email.body.encoded end
然后创建views/mailer_previews_index.erb视图文件,展示所有预览选项:
<h1>邮件预览列表</h1> <ul> <% previews.each do |preview_class, methods| %> <li><%= preview_class %> <ul> <% methods.each do |method| %> <li><a href="/rails/mailers/<%= preview_class.underscore %>/<%= method %>"><%= method %></a></li> <% end %> </ul> </li> <% end %> </ul>
3. 修改Mailer避免预览时发送邮件
当前test_email方法会直接调用deliver_now,预览时也会实际发送邮件,需要添加判断逻辑:
module CompanyName class Mailer < ActionMailer::Base def test_email(recipient_email_address) email = mail(to: recipient_email_address, from: "no-reply@companyname.com", subject: "Testing ActionMailer") do |format| format.html { "<h1>Testing</h1>" } end # 仅非预览环境下发送邮件 email.deliver_now unless ActionMailer::Preview.previewing? email end end end
4. 确保Mailer文件加载路径正确
在Sinatra主文件中添加加载路径,保证lib目录下的Mailer能被识别:
$LOAD_PATH.unshift(File.expand_path('../lib', __FILE__)) require 'companyname/mailers/mailer'
完成以上配置后,重启Sinatra应用,访问http://localhost:26250/rails/mailers即可查看邮件预览列表,点击对应链接就能查看邮件内容。
内容的提问来源于stack exchange,提问作者NJRBailey
相关产品推荐
相关产品推荐

