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

使用Action Mailer构建新闻通讯:预览报错及批量发送问题求助

问题:Action Mailer邮件预览及批量发送报错

我正尝试使用Action Mailer构建新闻通讯,但在尝试向所有注册用户发送邮件时遇到阻碍,且邮件预览功能无法正常工作,不断出现错误。

相关代码

schema.rb

ActiveRecord::Schema[7.0].define(version: 2022_12_31_110010) do
  create_table "users", force: :cascade do |t|
    t.string "emailadress"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
end

User模型的send_daily方法

def send_daily
    users = User.all(params[:id])
    users.each. do |user|
      UserMailer.send_daily_newsletter(user).deliver_now
    end
    redirect_to root_path, notice: 'Newsletter envoyée.'
end

UserMailer代码

class UserMailer < ApplicationMailer
  def send_daily_newsletter(user)
    @user = user
    mail(to: @user.emailadress, subject: 'Votre fait historique quotidien')
  end
end

邮件预览代码

class UserMailerPreview < ActionMailer::Preview
  def send_daily_newsletter
    user = User.all # Ou tout autre utilisateur de votre choix pour la prévisualisation
    UserMailer.send_daily_newsletter(user)
  end
end

报错信息

undefined method `emailadress' for #<ActiveRecord::Relation [#<User id: 14, emailadress: "thomasandrieu1997@gmail.com", created_at: "2023-07-02 10:32:46.657533000 +0000", updated_at: "2023-07-02 10:32:46.657533000 +0000">, #<User id: 15, emailadress: "than1544@colorad.edu", created_at: "2023-07-02 11:43:17.121218000 +0000", updated_at: "2023-07-02 11:43:17.121218000 +0000">]>

解决方法

错误核心原因

报错提示明确说明:你给UserMailer.send_daily_newsletter传递了用户集合(ActiveRecord::Relation),但该方法需要单个用户对象来调用emailadress属性。

1. 修复邮件预览代码

邮件预览只需要单个用户用于测试,将User.all替换为单个用户查询:

class UserMailerPreview < ActionMailer::Preview
  def send_daily_newsletter
    # 取数据库中第一个用户,或指定存在的用户ID
    user = User.first 
    # 也可以用 user = User.find(14) 替换为你数据库里的有效用户ID
    UserMailer.send_daily_newsletter(user)
  end
end

2. 修复User模型的send_daily方法

原方法存在两处语法/逻辑错误:

  • User.all(params[:id])写法错误,all方法不接受ID参数,获取所有用户直接用User.all
  • users.each. do多了一个多余的点,属于语法错误

修改后代码:

def send_daily
  users = User.all
  users.each do |user|
    UserMailer.send_daily_newsletter(user).deliver_now
  end
  redirect_to root_path, notice: 'Newsletter envoyée.'
end

额外优化建议

数据库字段名emailadress不符合Ruby下划线命名规范,建议改为email_address,避免后续潜在问题:

  1. 生成迁移文件:
rails generate migration RenameEmailadressToEmailAddress
  1. 编辑迁移文件内容:
class RenameEmailadressToEmailAddress < ActiveRecord::Migration[7.0]
  def change
    rename_column :users, :emailadress, :email_address
  end
end
  1. 执行迁移:
rails db:migrate
  1. 更新所有代码中的emailadress为email_address(包括UserMailer、模型方法等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:53:13