当添加了具有首选项的新记录时,Ruby on Rails会向用户发送电子邮件

时间:2015-04-02 11:29:57

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

在我的Ruby on Rails应用程序中,我正在创建一个影院网站。用户可以将自己喜欢的演员保存在偏好表中,而我想要做的就是如果添加了一部有这个演员的新电影,那么所有以该演员为他们喜爱的用户都会通过电子邮件发送电影的详细信息。

我的电子邮件系统已经在用户通过电子邮件发送,以确认他们已成功注册。

我遇到的问题是我需要通过控制器检索添加到新电影记录中的演员,如果这符合用户的偏好,则通过电子邮件发送给他们。但在拯救它之前,我正在努力研究如何检查电影的参数。

到目前为止,我已经在应用程序控制器中完成了以下操作,以找到他们最喜欢演员Benedict Cumberbatch的用户电子邮件:

def actor_user
    actor = "Benedict Cumberbatch"
    user = Perference.where(actor: actor).pluck(:user_id)
    User.where(id: user).pluck(:email)
end

这个问题也就是演员是硬编码的,而我想做的是从电影演员中提取电影三位演员的名字并通过这些演员进行检查。

Films_controller:

def create
    @film = Film.new(film_params)
    if @film.save
        redirect_to @film
    else
        render 'new'
    end
end

User_Mailer.rb

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')
    mail(to: @user.email, subject: 'Welcome to My Awesome Site')
  end
end

application_mailer:

class ApplicationMailer < ActionMailer::Base
  #default sender: "ben@thorcinemas.com"
  default from: "ben@thorcinemas.com"
  layout 'mailer'
end

配置/环境/ development.rb:

config.action_mailer.delivery_method = :smtp
# SMTP settings for gmail
config.action_mailer.smtp_settings = {
 :address              => "smtp.gmail.com",
 :port                 => 587,
 :user_name            => ENV['my_email
 :password             => ENV['my_password'],
 :authentication       => "plain",
:enable_starttls_auto => true
}

有人可以帮忙。我知道我需要一封新的电子邮件(因为我只有welcome_email.html.erb),所以在适当的时候需要这些。

这是架构:

  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

我理解我通过在电影表中使用actor1,actor2,actor3而不是拥有演员表来打破最佳实践,但是出于这个问题的目的,请忽略这一点。

1 个答案:

答案 0 :(得分:0)

所以,如果我理解正确,在添加了一些演员的电影之后,应该通过电子邮件通知一些用户。

我认为rails observers可以帮到你。您可以在after_create中编写逻辑。

class FilmObserver < ActiveRecord::Observer
  def after_create(film)
    # 1. fetch actors from film
    actors = [film.cast1, film.cast2, film.cast3]

    # 2. find users that should be notified
    user_ids = Perference.where(actor: actor).pluck(:user_id)
    user_emails = User.where(id: user).pluck(:email)

    # 3. send them emails
    UserMailer.send_notifications(user_emails)
  end
end

在user_mailer.rb

class UserMailer < ApplicationMailer
  # other things

  def send_notifications(emails)
    mail(to: emails, subject: 'My Shiny Notification')
  end
end

当然,这段代码可以改进,我只是想表达我的想法。 =)