在我的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而不是拥有演员表来打破最佳实践,但是出于这个问题的目的,请忽略这一点。
答案 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
当然,这段代码可以改进,我只是想表达我的想法。 =)