我有以下内容:
def create
@permission = @project.permissions.create(params[:permission])
respond_to do |format|
if @permission.save
format.js
else
format.js { render :js => @permission.errors }
end
end
end
我想添加一个Mailer,让用户知道他们已被添加到项目中,问题是,如果我在respond_to之前发布了,那么记录还没有被保存,所以有可能出错了,但用户仍然会收到一封电子邮件。
UserMailer.xxxxxxxxx_notification(objecthere).deliver
我猜我不能把邮件放在respond_to块中。建议?
答案 0 :(得分:7)
观察员用于。
创建app/models/permission_observer.rb
class PermissionObserver < ActiveRecord::Observer
def after_create(permission)
# put your mailer code here
end
end
在config/application.rb
中添加观察者
config.active_record.observers = :permission_observer
您可以阅读有关观察员here的更多信息。
此外,您应该使用@project.permissions.new
而不是创建。 create会立即保存模型,使您的@permission.save
调用更加冗长。
一旦你有了这个,你应该考虑使你的邮件代码异步,这样它就不会阻止web请求。 Here's an example使用delayed_job。
答案 1 :(得分:0)
或者您可以将代码编辑为:
def create
@permission = @project.permissions.build(params[:permission])
if @permission.save
UserMailer.xxxxxxxxx_notification(objecthere).deliver
respond_to do |format|
format.js
end
else
respond_to do |format|
format.js { render :js => @permission.errors }
end
end
end
答案 2 :(得分:0)
或者您可以在Permission模型中添加回调:
class Permission
after_create :send_mail
def send_mail
UserMailer.xxxxxxxxx_notification(self).deliver
end
end