【问题标题】:Ruby on Rails Why do I get the error: undefined method `email' for 69:Fixnum when trying to send an email?Ruby on Rails 为什么我在尝试发送电子邮件时收到错误:69:Fixnum 的未定义方法“电子邮件”?
【发布时间】:2015-06-14 22:11:32
【问题描述】:

好的,在我的 RoR 应用程序中,我有一个影院系统,用户可以在其中设置偏好,包括保存他们最喜欢的演员。我想做的是得到它,以便在添加新电影时,如果用户将电影的任何演员保存为他们的最爱,他们将收到一封电子邮件,通知他们该电影。目前我正在尝试做一个简化版本,如果电影有演员利亚姆尼森,那么只有一个用户会收到电子邮件,并且电子邮件将与用户登录网站时收到的电子邮件相同(我已经让这个功能正常工作)。

电影控制器:

def create
    @film = Film.new(film_params)
    if @film.save
        user = Perference.where(actor: "Liam Neeson").pluck(:user_id).first
        if not user.blank?
            UserMailer.welcome_email(user).deliver
        end
        redirect_to @film
    else
        render 'new'
    end
end

user_mailer:

class UserMailer < ApplicationMailer
  default from: 'no-reply@thorcinemas.com'

  def welcome_email(user)
    @user = user
    @url  = 'http://localhost:3000/users/login'
    mail(to: @user.email, subject: 'Welcome to My Awesome Site')
  end
end

welcome_email.html.erb:

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1>Welcome to Thor Cinemas, <%= @user.first_name %>!</h1>
    <p>
      You have successfully signed up to Thor Cinemas,
      your username is: <%= @user.first_name %> <%= @user.last_name %>.<br>
    </p>
    <p>
      To login to the site, just follow this link: <%= @url %>.
    </p>
    <p>Thanks for joining and have a great day!</p>
  </body>
</html>

和架构:

 create_table "films", force: :cascade do |t|
     t.string   "title"
     t.string   "synopsis"
     t.string   "director"
     t.string   "cast1"
     t.string   "cast2"
     t.string   "cast3"
     t.date     "release_date"
     t.string   "warnings"
     t.datetime "created_at",     null: false
     t.datetime "updated_at",     null: false
     t.string   "image_url"
     t.string   "certificate_id"
     t.integer  "category_id"
     t.integer  "hours"
     t.integer  "minutes"
     t.string   "video_url"
  end

create_table "perferences", force: :cascade do |t|
    t.integer  "user_id"
    t.integer  "category_id"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.text     "colour"
    t.text     "actor"
  end

 create_table "users", force: :cascade do |t|
     t.string   "password_digest"
     t.string   "role"
     t.datetime "created_at",      null: false
     t.datetime "updated_at",      null: false
     t.string   "first_name"
     t.string   "last_name"
     t.string   "house_no"
     t.string   "street"
     t.string   "town"
     t.string   "postcode"
     t.string   "email"
     t.date     "date_of_birth"
  end

但是得到以下错误:

NoMethodError in FilmsController#create
undefined method `email' for 69:Fixnum

我知道我的代码目前存在问题,例如,在电影表中包含 cast1、cast2 和 cast3 不是最佳做法,并且没有任何验证来确保仅向用户发送电子邮件如果他们最喜欢的演员与电影的演员相匹配,但我现在只是想发送一封电子邮件,稍后再处理。

有人可以帮忙吗。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 email ruby-on-rails-4


    【解决方案1】:

    您正在将 Integer (user_id) 从控制器传递给变量 user 到邮件程序。您需要改为传递 user 对象。

    我看不到你的模型,但是,假设你已经设置了正确的关联,你需要更新你的代码来找到这样的用户:

    user = Perference.where(actor: "Liam Neeson").first.user
    

    【讨论】:

    • 好的,现在我正在尝试发送特定的电子邮件,我已经添加了方法:def favourite_actor(user) @user = user @url = 'http://localhost:3000/films' mail(to: @user.email, subject: 'Your favourite actor stars in a new film') end 到 user_mailer 和 UserMailer.favourite_actor(user).deliver 到films_controller 但收到此错误:undefined method favourite_actor' 用于 UserMailer:类`有什么建议吗?
    • 我建议您将 RAJ 的答案标记为已接受并创建另一个问题,以便您承认他为帮助您所做的努力并让您的新问题在主要问题页面上更加可见 =]
    • 谢谢@Thyago。 Benjs.1,您可以在此处粘贴新问题的链接,以便我们为您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2021-06-17
    • 2015-06-15
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多