在控制器中,我想将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?
答案 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"
}