Rails:JSON中的validation错误代码
所以,我正在编写Rails web应用程序,该应用程序具有用于移动应用程序的JSON API。 例如,它将POST JSON请求发送到example.com/api/orders以创建订单。
{id: 1, order: { product_name: "Pizza", price: 10000}}
如果出现validation错误,我可以使用HTTP 422错误代码和json中的order.errors.full_messages进行响应。 但我觉得在JSON响应中有特定的错误代码似乎更好。 不幸的是,似乎Rails没有提供为validation错误设置错误代码的能力。 如何解决这个问题呢?
您可以在呈现响应时使用status
选项传递自定义状态代码。
def create @order = ... if @order.save render json: @order else render json: { message: "Validation failed", errors: @order.errors }, status: 400 end end
我通常倾向于在validation错误上返回HTTP 400。 该消息是可读状态响应,还附加了错误。
这是一个响应的例子
{ message: "Validation failed", errors: [ ... ] }
您还可以嵌入其他属性。
我是在追求类似的东西,所以我做的是扩展String例如
class ErrorCodeString < String def init(value, error_code) @error_code = error_code super(value) end def error_code @error_code end end
然后在自定义validation中(这不适用于标准validation)我会这样做
errors.add(:email, ErrorCodeString.new('cannot be blank', 50)
现在,当您返回JSON时,您可以检查错误值是否为ErrorCodeString并将error_code值添加到输出中。 由于ErrorStringinheritance了String,因此在此过程中不应该破坏其他任何东西。
Rails 5有error.details,可以用于它。
在模型中
errors.add(:price, 1023, message: "Transaction value #{price} is above limit (#{maximum_price}).")
在控制器中
format.json { render json: @order.errors.details, status: :unprocessable_entity }
错误细节可以是任何东西,例如。 你也可以使用:above_limit而不是1023. API响应体将会是这样的
pp JSON.parse(response) {"price"=>[{"error"=>1023}]}
此function已被移植到Rails 4,另请参阅http://blog.bigbinary.com/2016/05/03/rails-5-adds-a-way-to-get-information-about-types-of-failed -validations.html
另外: 除了rails活动记录validation中的错误消息之外,还有办法返回错误代码吗?