我想知道在inherited_resources框架中创建或更新记录时发送电子邮件的最佳方法是什么。
现在我正在这样做:
def create
create!
UserMailer.create(object).deliver if @user.valid?
end
def update
update!
UserMailer.update(object).deliver if @user.valid?
end
这很有意义,但似乎有点笨重。我尝试在成功响应块中执行此操作,但这似乎也是一件坏事。我也尝试过使用update_resource和create_resource方法。它们都有效,但所有这些都看起来不太优雅。
也许我正在尝试将代码最小化!
答案 0 :(得分:1)
我更喜欢DDD方法,使用ActiveRecord callbacks
因此,如果您想在每次保存模型Example
后发送电子邮件,则应该执行此操作
class Example < ActiveRecord::Base
after_save :send_email
protected
def send_email
UserMailer.create(object).deliver
end
end
答案 1 :(得分:1)
这是我目前正在做的事情。对我而言,这是最好的,不那么混淆的方法:
after_filter :send_create_email, :only => :create
after_filter :send_update_email, :only => [:update, :update_password]
private
def send_create_email
UserMailer.create(@user).deliver if @user.valid?
end
def send_update_email
UserMailer.update(@user).deliver if @user.valid?
end
Nathans方法很好,直到我需要非标准的方法名称。
答案 2 :(得分:0)
我更喜欢这种方法:
def create
if @user.save # if your user is saved it should be valid
do something
else
do something else
end
end
def update
if @user.update_attributes(params[:user])
do something
else
do something else
end
end
答案 3 :(得分:0)
您可以重构发送电子邮件并使用后续过滤器。在这种情况下,除非您正在修改其默认行为,否则可以删除创建和更新。未经测试,但这是个主意:
after_filter :send_email, :only => [ :create, :update ]
private
def send_email
UserMailer.send(request[:action].to_sym, @user).deliver if @user.valid?
end
答案 4 :(得分:0)
我认为覆盖create_resource
是个好方法:
# Responsible for saving the resource on :create method. Overwriting this
# allow you to control the way resource is saved. Let's say you have a
# PassworsController who is responsible for finding an user by email and
# sent password instructions for him. Instead of overwriting the entire
# :create method, you could do something:
#
# def create_resource(object)
# object.send_instructions_by_email
# end
#
def create_resource(object)
object.save
end
它看起来像这样:
ActiveAdmin.register SomeModel do
controller do
def create_resource(object)
# TODO
end
end
end