Rails 观察者和邮寄者
Rails Observers & Mailer
我正在研究如何向新用户发送欢迎电子邮件。
我昨天问过这个问题
它投了反对票(我不知道如何找出原因)并且无法获得任何建设性的帮助。
我已经找到 rails-observer gem 并且正在尝试另一种方法。
我的问题是,当我推送并尝试时,我收到一条错误消息:NameError (uninitialized constant UserObserver::Mailer).
我对该错误的理解是没有与观察者姓名匹配的模型。我肯定有一个 user.rb 模型,我的应用程序中也有一个名为 Mailer 的文件。
我有以下设置:
在我的模型文件夹中,我有 user_observer.rb:
class UserObserver < ActiveRecord::Observer
def after_save(user)
Mailer.welcome_mail(user).deliver!
end
end
User/Registration_controller:
def create
@user = User.new(user_params)
respond_to do |format|
if resource.save
format.html { redirect_to(profiles_path)}
else
format.html { render action: 'new' }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
app/mailers/welcome_mail.rb
:
class WelcomeMail < ActionMailer::Base
self.delivery_method = :smtp
self.smtp_settings = {
user_name: ENV['WELCOME'],
password: ENV['D_WELCOME'],
port: ...,
domain: 'gmail.com',
address: 'smtp.gmail.com',
authentication: 'plain',
enable_starttls_auto: true
}
def new_user_waiting_for_access(user)
@user = user
mail(to: user.email, from: "...@....com", subject: "Welcome #{user.first_name}")
end
end
User.rb
:
def send_user_welcome_mail
AdminMailer.new_user_waiting_for_access(self).deliver
end
application.rb
:
config.active_record.observers = :user_observer
具体错误为:
NameError (uninitialized constant UserObserver::Mailer):
2015-08-12T03:14:33.002104+00:00 app[web.1]: app/models/user_observer.rb:3:in `after_save'
2015-08-12T03:14:33.002106+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:21:in `block in create'
2015-08-12T03:14:33.002108+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:20:in `create'
2015-08-12T03:14:33.002109+00:00 app[web.1]:
2015-08-12T03:14:33.002110+00:00 app[web.1]:
2015-08-12T03:14:33.002111+00:00 app[web.1]:
2015-08-12T03:14:33.002113+00:00 app[web.1]: NameError (uninitialized constant UserObserver::Mailer):
2015-08-12T03:14:33.002114+00:00 app[web.1]: app/models/user_observer.rb:3:in `after_save'
2015-08-12T03:14:33.002116+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:21:in `block in create'
2015-08-12T03:14:33.002117+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:20:in `create'
2015-08-12T03:14:33.002118+00:00 app[web.1]:
我不明白这个错误是什么意思。我有一个用户观察器,它应该观察用户并在用户保存时发送邮件。
电子邮件的内容显示在名为:welcome_mail.html.erb.
的视图中
谁能看出我做错了什么?
我已经评论了 devise confirmable out - 所以它不是在寻找确认。我读过其他问题,这些问题可能与设计一个名为 mailer 的视图文件夹有关。我不知道在这个问题的上下文中这意味着什么,因为我没有尝试从 devise 发送邮件。
在你发布的代码中你有这个:Mailer.welcome_mail(user).deliver!
这是错误的,因为你没有定义 Mailer
class 也没有定义 welcome_mail
方法,所以这种做法是错误的。
我想你想使用你定义的邮件程序 class WelcomeMail
并且在 WelcomeMail
class 里面你必须定义一个 welcome_mail
方法向用户发送邮件的逻辑。
有点像这样:
class WelcomeMail < ActionMailer::Base
def welcome_mail(user)
@user = user
@url = 'http://example.com/login'
mail(to: @user.email, subject: 'Welcome to My Awesome Site')
end
end
因此,您的 user_observer.rb
变为:
class UserObserver < ActiveRecord::Observer
def after_save(user)
WelcomeMail.welcome_mail(user).deliver!
end
end
我正在研究如何向新用户发送欢迎电子邮件。
我昨天问过这个问题 它投了反对票(我不知道如何找出原因)并且无法获得任何建设性的帮助。
我已经找到 rails-observer gem 并且正在尝试另一种方法。
我的问题是,当我推送并尝试时,我收到一条错误消息:NameError (uninitialized constant UserObserver::Mailer).
我对该错误的理解是没有与观察者姓名匹配的模型。我肯定有一个 user.rb 模型,我的应用程序中也有一个名为 Mailer 的文件。
我有以下设置:
在我的模型文件夹中,我有 user_observer.rb:
class UserObserver < ActiveRecord::Observer
def after_save(user)
Mailer.welcome_mail(user).deliver!
end
end
User/Registration_controller:
def create
@user = User.new(user_params)
respond_to do |format|
if resource.save
format.html { redirect_to(profiles_path)}
else
format.html { render action: 'new' }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
app/mailers/welcome_mail.rb
:
class WelcomeMail < ActionMailer::Base
self.delivery_method = :smtp
self.smtp_settings = {
user_name: ENV['WELCOME'],
password: ENV['D_WELCOME'],
port: ...,
domain: 'gmail.com',
address: 'smtp.gmail.com',
authentication: 'plain',
enable_starttls_auto: true
}
def new_user_waiting_for_access(user)
@user = user
mail(to: user.email, from: "...@....com", subject: "Welcome #{user.first_name}")
end
end
User.rb
:
def send_user_welcome_mail
AdminMailer.new_user_waiting_for_access(self).deliver
end
application.rb
:
config.active_record.observers = :user_observer
具体错误为:
NameError (uninitialized constant UserObserver::Mailer):
2015-08-12T03:14:33.002104+00:00 app[web.1]: app/models/user_observer.rb:3:in `after_save'
2015-08-12T03:14:33.002106+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:21:in `block in create'
2015-08-12T03:14:33.002108+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:20:in `create'
2015-08-12T03:14:33.002109+00:00 app[web.1]:
2015-08-12T03:14:33.002110+00:00 app[web.1]:
2015-08-12T03:14:33.002111+00:00 app[web.1]:
2015-08-12T03:14:33.002113+00:00 app[web.1]: NameError (uninitialized constant UserObserver::Mailer):
2015-08-12T03:14:33.002114+00:00 app[web.1]: app/models/user_observer.rb:3:in `after_save'
2015-08-12T03:14:33.002116+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:21:in `block in create'
2015-08-12T03:14:33.002117+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:20:in `create'
2015-08-12T03:14:33.002118+00:00 app[web.1]:
我不明白这个错误是什么意思。我有一个用户观察器,它应该观察用户并在用户保存时发送邮件。
电子邮件的内容显示在名为:welcome_mail.html.erb.
的视图中谁能看出我做错了什么?
我已经评论了 devise confirmable out - 所以它不是在寻找确认。我读过其他问题,这些问题可能与设计一个名为 mailer 的视图文件夹有关。我不知道在这个问题的上下文中这意味着什么,因为我没有尝试从 devise 发送邮件。
在你发布的代码中你有这个:Mailer.welcome_mail(user).deliver!
这是错误的,因为你没有定义 Mailer
class 也没有定义 welcome_mail
方法,所以这种做法是错误的。
我想你想使用你定义的邮件程序 class WelcomeMail
并且在 WelcomeMail
class 里面你必须定义一个 welcome_mail
方法向用户发送邮件的逻辑。
有点像这样:
class WelcomeMail < ActionMailer::Base
def welcome_mail(user)
@user = user
@url = 'http://example.com/login'
mail(to: @user.email, subject: 'Welcome to My Awesome Site')
end
end
因此,您的 user_observer.rb
变为:
class UserObserver < ActiveRecord::Observer
def after_save(user)
WelcomeMail.welcome_mail(user).deliver!
end
end