以下代码示例是在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(...)并返回”。
要发送消息,请使用mail_form gem ~> 1.5.0
。
DoubleRenderError似乎发生了,因为create
和update
在完成工作时都会呈现JSON响应。之后,.deliver
呈现其JSON响应以通知成功或失败。
答案 0 :(得分:0)
由于错误指出您需要在致电render
后返回,因为您在render
方法中多次调用deliver_location_message(message)
。出错的原因是Rails继续执行直到方法结束,而不管渲染或重定向。
请尝试以下方法。请注意每个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