5

在控制器中,我想替换if..render..else..renderrespond_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"
    ]
  }
}

产品、价格和名称是示例。我希望整个应用程序都有这种行为。

我正在使用响应者 gem,并且我已经阅读过可以自定义响应者和序列化程序。但是这些部分是如何组合在一起的呢?

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

4

2 回答 2

3

自定义用户警报的其他几种方法

你可以把它排成一行:

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

或者:您可以只引用您的 [locale file] 并在那里输入自定义消息。1

t(:message)

希望这可以帮助 :)

于 2017-06-12T17:39:58.630 回答
0

我找到了一种将错误哈希作为一个句子的临时方法。但它不仅是骇人听闻的,而且它也不能 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"
}
于 2017-06-12T17:29:40.020 回答