使用mail_form传递消息时出现DoubleRenderError

时间:2013-12-07 23:55:20

标签: ruby-on-rails internal-server-error mail-form

以下代码示例是在Ruby 1.9.3p484上运行的Rails 3.2.16应用程序的一部分 每当创建新位置或更新一个位置时,都应按照after_filter中的定义发送消息。

class LocationController < InheritedResources::Base

  respond_to :json

  after_filter :notify_location_contact, only: [:create, :update]

  def create
    @location.user = current_user if current_user
    create!
  end

  def update
    update!
  end


  private

  def notify_location_contact
    message = MailForm.new
    deliver_location_message(message)
  end

  def deliver_location_message(location_message)
    begin
      if location_message.deliver
        render json: { message: "Successfully delivered" }, status: 201
      else
        render json: { error: "Delivery failure" }, status: 500
      end
    rescue => e
      if e.is_a?(ArgumentError)
        render json: { error: "Invalid Recipient" }, status: 422
      else
        render json: { error: e.message }, status: 500
      end
    end
  end

end

邮件本身已发送。但是,deliver_location_message首先呈现“成功传递”块,并在最后一个块之后呈现错误消息。这会导致内部服务器错误:

  

已完成500内部服务器错误

     

AbstractController :: DoubleRenderError - 呈现和/或重定向   在此操作中多次调用。请注意,您可能只是   调用渲染或重定向,每次操作最多一次。另请注意   既不重定向也不渲染终止执行动作,所以如果   你想在重定向后退出一个动作,你需要做点什么   比如“redirect_to(...)并返回”。

要发送消息,请使用mail_form gem ~> 1.5.0

DoubleRenderError似乎发生了,因为createupdate在完成工作时都会呈现JSON响应。之后,.deliver呈现其JSON响应以通知成功或失败。

1 个答案:

答案 0 :(得分:0)

由于错误指出您需要在致电render后返回,因为您在render方法中多次调用deliver_location_message(message)。出错的原因是Rails继续执行直到方法结束,而不管渲染或重定向。

请尝试以下方法。请注意每个return行上的render

  def deliver_location_message(message)
    begin
      if message.deliver
        # Here
        return render json: { message: "Successfully delivered" }, status: 201
      else
        # Here
        return render json: { error: "Delivery failure" }, status: 500
      end
    rescue => e
      if e.is_a?(ArgumentError)
        # Here
        return render json: { error: "Invalid Recipient" }, status: 422
      else
        # Here
        return render json: { error: e.message }, status: 500
      end
    end
  end

替代语法:

return render json: { message: "Successfully delivered" }, status: 201

是:

render json: { message: "Successfully delivered" }, status: 201 and return