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

Ruby on Rails中如何修改MailForm生成邮件的属性输出格式?

解决方案

你使用的是mail_form gem,要调整邮件展示格式可以通过两种方案实现,以下是具体修改步骤:

方案一:直接修改模型配置(简单快速)

直接修改contact.rb文件,关闭默认属性自动输出,自定义邮件正文内容,同时修正原有headers参数的错误:

class Contact < MailForm::Base
  # 给所有属性添加show_in_email: false,禁止默认自动输出到邮件
  attribute :Guest_One_First_Name, show_in_email: false
  attribute :Guest_One_Surname, show_in_email: false
  attribute :Guest_Two_First_Name, show_in_email: false
  attribute :Guest_Two_Surname, show_in_email: false
  attribute :Children, show_in_email: false
  attribute :Restrictions, show_in_email: false
  attribute :Attending, show_in_email: false

  # 自定义邮件正文
  def body
    content = []
    content << "嘉宾1:#{Guest_One_First_Name} #{Guest_One_Surname}"
    # 如果嘉宾2是可选字段,可添加判断,有值才展示
    content << "嘉宾2:#{Guest_Two_First_Name} #{Guest_Two_Surname}" if Guest_Two_First_Name.present?
    # 过滤Attending的空值后用逗号拼接
    content << "Attending: #{Attending.reject(&:blank?).join(', ')}"
    # 如果需要保留儿童数量、饮食限制信息,可取消下面两行的注释
    # content << "儿童数量:#{Children}"
    # content << "饮食限制:#{Restrictions.presence || '无'}"
    content.join("\n")
  end

  def headers
    {
      subject: "RSVP",
      to: 'mariagenourcolas@gmail.com',
      # from需要替换为你实际配置的发件人邮箱,否则会发送失败
      from: %("#{Guest_One_First_Name} #{Guest_One_Surname}" <你的发件人邮箱@你的域名.com>),
      # 如果你表单收集了用户邮箱,可在此处配置reply_to为用户邮箱,否则可删除该参数
      # reply_to: 用户填写的邮箱
    }
  end
end

方案二:自定义邮件视图(适合后续频繁调整格式)

如果后续需要灵活修改邮件样式、添加更多内容,推荐用自定义视图的方式:

  1. 在项目app/views目录下新建mail_form文件夹
  2. 在文件夹内新建contact.text.erb(纯文本邮件)或者contact.html.erb(HTML格式邮件)
  3. 在模板内直接编写你需要的展示格式,示例如下:
嘉宾1:<%= @resource.Guest_One_First_Name %> <%= @resource.Guest_One_Surname %>
嘉宾2:<%= @resource.Guest_Two_First_Name %> <%= @resource.Guest_Two_Surname %>
Attending: <%= @resource.Attending.reject(&:blank?).join(', ') %>

该方案不需要修改模型的属性配置,后续调整格式只需要修改视图文件即可。


可选优化:修复Attending空值问题

你当前收到的Attending数组里有空字符串,是因为Rails的collection_check_boxes默认会生成隐藏的空值input,你可以修改前端erb代码关闭该功能,减少后端处理压力:
找到前端代码中collection_check_boxes对应的行,修改为:

<%= f.collection_check_boxes :Attending, [['Brunch'] ,['Ceremony']], :first, :last, include_hidden: false %>

内容的提问来源于stack exchange,提问作者marie566

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:06:03