You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails应用创建预订后Letter Opener无邮件显示问题求助

Rails航班预订确认邮件不显示排查方案

1. 核对Gem与环境配置

  • 确认Gemfile里仅在开发环境声明letter_opener:
    group :development do
      gem 'letter_opener'
    end
    
    执行过bundle 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:50:50