如何在验证错误的情况下自定义response_with呈现的JSON?

时间:2017-06-12 15:52:19

标签: ruby-on-rails json active-model-serializers respond-with responders

在控制器中,我想将if..render..else..render替换为respond_with

# Current implementation (unwanted)
def create
  @product = Product.create(product_params)
  if @product.errors.empty?
    render json: @product
  else
    render json: { message: @product.errors.full_messages.to_sentence }
  end
end

# Desired implementation (wanted!)
def create
  @product = Product.create(product_params)
  respond_with(@product)
end

respond_with的问题在于,如果出现验证错误,JSON将以特定方式呈现,而这种方式与客户端应用程序所期望的不相符:

# What the client application expects:
{
  "message": "Price must be greater than 0 and name can't be blank"
}

# What respond_with delivers (unwanted):
{
  "errors": {
    "price": [
      "must be greater than 0"
    ],
    "name": [
      "can't be blank"
    ]
  }
}

产品,价格和名称就是例子。我想在整个应用程序中使用这种行为。

我正在使用responders gem,并且我已经阅读了它可以自定义响应者和serializers。但这些碎片如何组合在一起?

如何自定义respond_with在验证错误时呈现的JSON?

2 个答案:

答案 0 :(得分:3)

其他几种自定义用户提醒的方法

你可以把它排成一行:

render json: { message: "Price must be greater than 0" }

或:您可以引用您的[区域设置文件]并在其中输入自定义消息。 1

t(:message)

希望这会有所帮助:)

答案 1 :(得分:0)

我找到了一种将错误哈希作为一个句子来解决问题的方法。但它不仅是hackish,而且还与100%的期望输出不匹配。我仍然希望有一种方法可以使用自定义序列化程序或响应程序。

module ActiveModel
  class Errors
    def as_json(*args)
      full_messages.to_sentence
    end
  end
end

# OUTPUT
{
  "errors": "Price must be greater than 0 and name can't be blank"
}