以下代码示例是在 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 响应以告知成功或失败。