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 - このアクションで、レンダリングおよび/またはリダイレクトが複数回呼び出されました。render または redirect のみを呼び出すことができ、アクションごとに最大 1 回しか呼び出せないことに注意してください。また、redirect も render もアクションの実行を終了しないことに注意してください。したがって、リダイレクト後にアクションを終了する場合は、「redirect_to(...) and return」のようなことを行う必要があります。

メッセージの送信には、mail_form gem ~> 1.5.0が使用されます。

DoubleRenderError は、作業が終了したときに両方が JSON 応答をレンダリングするためcreateに発生するようです。updateその後、.deliverJSON 応答をレンダリングして、成功または失敗を通知します。

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 に答える