从Rails中的API返回正确的错误

时间:2014-05-06 18:15:03

标签: ruby-on-rails api-design

我有以下#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用户了解它的正确方法是什么?

2 个答案:

答案 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

中找回一系列错误