Rails应用创建预订后Letter Opener无邮件显示问题求助
Rails航班预订确认邮件不显示排查方案
1. 核对Gem与环境配置
- 确认
Gemfile里仅在开发环境声明letter_opener:
执行过group :development do gem 'letter_opener' endbundle install让依赖生效。 - 检查
config/environments/development.rb的邮件配置:
必须开启投递并指定letter_opener方式:
重点确认config.action_mailer.delivery_method = :letter_opener config.action_mailer.perform_deliveries = true config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }perform_deliveries设为true,否则邮件不会被投递。
2. 检查预订创建后的邮件触发逻辑
打开bookings_controller.rb的create方法,确认预订保存成功后调用了邮件发送方法,且使用deliver_now(新手优先用这个避免后台队列问题):
def create @booking = Booking.new(booking_params) if @booking.save # 替换为实际的邮件触发代码,比如给关联乘客发邮件 PassengerMailer.booking_confirmation(@booking.passengers.first).deliver_now redirect_to @booking, notice: '预订已创建' else render :new end end
如果用了deliver_later,需确保后台任务服务(比如Sidekiq)在运行,否则邮件会积压在队列里不显示。
3. 验证邮件类的实现
检查passenger_mailer.rb是否正确继承ApplicationMailer,且邮件方法逻辑正确:
class PassengerMailer < ApplicationMailer default from: 'no-reply@flight-booker.com' def booking_confirmation(passenger) @passenger = passenger mail(to: passenger.email, subject: '你的航班预订已确认') end end
要保证mail方法正确调用,且对应邮件模板(app/views/passenger_mailer/booking_confirmation.html.erb或.text.erb)存在。
4. 确认路由配置
检查routes.rb是否添加了letter_opener的挂载路由:
mount LetterOpenerWeb::Engine, at: "/letter_opener" if Rails.env.development?
访问时使用正确路径:http://localhost:3000/letter_opener,注意端口要和本地Rails服务一致。
5. 手动测试邮件发送
在Rails控制台直接触发邮件,验证是否能生成:
rails c # 取一个已存在的乘客实例测试 passenger = Passenger.first PassengerMailer.booking_confirmation(passenger).deliver_now
刷新letter_opener页面,若仍无邮件,根据控制台报错信息修复(比如乘客邮箱格式错误、模板缺失等)。
内容的提问来源于stack exchange,提问作者CoolGuy
相关产品推荐
相关产品推荐

