【问题标题】:DoubleRenderError when delivering message with mail_form使用 mail_form 传递消息时出现 DoubleRenderError
【发布时间】:2013-12-25 05:44:34
【问题描述】:

以下代码示例是在 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(...) and return”。

使用mail_form gem ~&gt; 1.5.0 发送消息。

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

【问题讨论】:

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


    【解决方案1】:

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

    请尝试以下操作。请注意每个 render 行上的 return

      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
    

    【讨论】:

    • @JJD,你能在你的问题中发布你的完整跟踪吗?
    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2016-11-04
    相关资源
    最近更新 更多