0

以下代码示例是在 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 ~> 1.5.0

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

4

1 回答 1

0

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

请尝试以下方法。注意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
于 2013-12-07T23:57:51.077 回答