【发布时间】: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 ~> 1.5.0 发送消息。
DoubleRenderError 似乎发生了,因为 create 和 update 都在完成工作时呈现 JSON 响应。之后,.deliver 呈现其 JSON 响应以告知成功或失败。
【问题讨论】:
标签: ruby-on-rails internal-server-error mail-form