Rails after_save发送包含更新列的邮件

时间:2014-12-15 11:16:50

标签: ruby-on-rails

我遇到了一个问题,我希望在rails中的after_save回调之后发送邮件。

以下是我的代码段:

class Response < ActiveRecord::Base
  after_create :pending_with

protected
  def pending_with
    self.approver = self.mapping.user
  end
end

class ResponsesController < ApplicationController
  def create
    @response = current_user.responses.new(response_params)
    respond_to do |format|
      if @response.save
        flash[:notice] = "Response has been saved successfully."
        Notification.confirm_approver(@response).deliver
        format.html { redirect_to dashboard_home_url }
      else
        flash[:error] = "There is some problem while saving the responses. Please try again."
        format.html { render action: 'new' }
      end
    end
  end
end

class Notification < ApplicationMailer
  def confirm_approver(response)
    @response = response
    p "============"
    p @response.approver.email.inspect
  end
end

我的问题是,我没有获得批准。得到错误:

undefined method `approver' for nil:NilClass

当我检查数据库中的记录时,apporver(&#39; id&#39;)已成功保存。我在这里错过了什么吗?

回溯:

app/mailers/notification.rb:11:in `confirm_approver'
vendor/gems/ruby/1.9.1actionpack (4.1.8) lib/abstract_controller/base.rb:189:in `process_action'
vendor/gems/ruby/1.9.1actionpack (4.1.8) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
vendor/gems/ruby/1.9.1activesupport (4.1.8) lib/active_support/callbacks.rb:82:in `run_callbacks'
vendor/gems/ruby/1.9.1actionpack (4.1.8) lib/abstract_controller/callbacks.rb:19:in `process_action'
vendor/gems/ruby/1.9.1actionpack (4.1.8) lib/abstract_controller/base.rb:136:in `process'
vendor/gems/ruby/1.9.1actionview (4.1.8) lib/action_view/rendering.rb:30:in `process'
vendor/gems/ruby/1.9.1actionmailer (4.1.8) lib/action_mailer/base.rb:580:in `block in process'
vendor/gems/ruby/1.9.1activesupport (4.1.8) lib/active_support/notifications.rb:159:in `block in instrument'
vendor/gems/ruby/1.9.1activesupport (4.1.8) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
vendor/gems/ruby/1.9.1activesupport (4.1.8) lib/active_support/notifications.rb:159:in `instrument'
vendor/gems/ruby/1.9.1actionmailer (4.1.8) lib/action_mailer/base.rb:577:in `process'
vendor/gems/ruby/1.9.1actionmailer (4.1.8) lib/action_mailer/base.rb:568:in `initialize'
vendor/gems/ruby/1.9.1actionmailer (4.1.8) lib/action_mailer/base.rb:551:in `new'
vendor/gems/ruby/1.9.1actionmailer (4.1.8) lib/action_mailer/base.rb:551:in `method_missing'
app/controllers/responses_controller.rb:23:in `block in create'
vendor/gems/ruby/1.9.1actionpack (4.1.8) lib/action_controller/metal/mime_responds.rb:433:in `call'
vendor/gems/ruby/1.9.1actionpack (4.1.8) lib/action_controller/metal/mime_responds.rb:433:in `retrieve_collector_from_mimes'
vendor/gems/ruby/1.9.1actionpack (4.1.8) lib/action_controller/metal/mime_responds.rb:256:in `respond_to'
app/controllers/responses_controller.rb:19:in `create'

1 个答案:

答案 0 :(得分:0)

嗨基于@zwippie输入,它有效。只是对它做了一点修改。

def create
  @response = current_user.responses.new(response_params)

  respond_to do |format|
    if @response.save && @response.reload
      Notification.confirm_approver(@response).deliver
      flash[:notice] = "Response has been created successfully."
    else
      format.html { render action: 'new' }
    end
  end
end