我有以下#create方法:
def create
begin
@order = @api_user.orders.create!(order_params)
render :json => @order, :only => [:id], :status => :created, :location => @order
rescue
render :json => {}, :status => :unprocessable_entity
end
end
但是,我正在使用一种通用的方法进行救援。如果由于其中一个传递的字段未通过验证而无法创建订单,我想让用户知道这一点。所以,如果订单的创建提出了这个:
ActiveRecord::RecordInvalid: Validation failed: Description1 is too long (maximum is 35 characters)
捕获并让API用户了解它的正确方法是什么?
答案 0 :(得分:1)
您可以做的一件事是使用轻型API库,如火箭剂(https://github.com/Sutto/rocket_pants)
在这种情况下,您想要的方法可以这样写:
def create
if @order = @api_user.orders.create!(order_params)
expose @order
else
error! :bad_request, :metadata => {:error_description => "#{@order.errors.full_messages}"}
end
end
这假设您已经在某处提前设置了@api_user
实例变量。此外,gem使用活动模型序列化器(https://github.com/rails-api/active_model_serializers)将@order
序列化为JSON,因此您始终可以通过创建基本序列化程序来自定义输出,查看github页面以获取更多信息:)
答案 1 :(得分:0)
这是另一种方式:
def create
@order = @api_user.orders.build(order_params)
if @order.save
render :json => @order,
:only => [:id], :status => :created, :location => @order
else
render :status => :unprocessable_entity,
:json => {:errors => @order.errors.full_messages}
end
end
您将在JSON
中找回一系列错误