rails,如何知道何时发送DEF CREATE的电子邮件

时间:2010-11-18 01:53:02

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

我有以下内容:

  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块中。建议?

3 个答案:

答案 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