次のコード サンプルは、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
その後、.deliver
JSON 応答をレンダリングして、成功または失敗を通知します。