使用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.allusers.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,避免后续潜在问题:
- 生成迁移文件:
rails generate migration RenameEmailadressToEmailAddress
- 编辑迁移文件内容:
class RenameEmailadressToEmailAddress < ActiveRecord::Migration[7.0] def change rename_column :users, :emailadress, :email_address end end
- 执行迁移:
rails db:migrate
- 更新所有代码中的
emailadress为email_address(包括UserMailer、模型方法等)。
内容的提问来源于stack exchange,提问作者Tholas
相关产品推荐
相关产品推荐

