Ruby on Rails为什么我会收到错误:未定义的方法`email'为69:Fixnum在尝试发送电子邮件时?

时间:2015-04-09 13:45:15

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

好的,在我的RoR应用程序中,我有一个用户有偏好的影院系统,其中包括保存他们最喜欢的演员。我想要做的就是这样做,以便在添加新电影时,如果用户将任何电影的演员保存为他们的最爱,他们将收到一封电子邮件,通知他们这部电影。在这一刻我试图做一个简化的版本,只有一个用户将通过电子邮件发送电影,如果电影有演员Liam Neeson,电子邮件将与用户签署网站时收到的电子邮件相同(我已经有这个功能工作)。

films_controller:

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并不是最佳做法,并且没有任何验证可确保用户仅通过电子邮件发送如果他们最喜欢的演员与电影的演员相匹配,但我只是想在一分钟发送一封电子邮件,稍后会处理这些。

有人可以帮忙。

1 个答案:

答案 0 :(得分:1)

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

我无法看到您的模型,但是,假设您已经设置了正确的关联,则需要更新代码以便找到这样的用户:

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