Как настроить JSON, который отображает response_with в случае ошибок проверки?
В контроллере хочу заменить 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"
]
}
}
Продукт, цена и название являются примерами. Я хочу, чтобы это поведение во всем приложении.
Я использую гем респондентов и прочитал, что можно настроить респонденты и сериализаторы. Но как кусочки сочетаются друг с другом?
Как настроить JSON, который respond_with
оказывает в случае ошибок проверки?
2 ответа
Пара других способов настроить пользовательские оповещения
Вы можете просто поместить это в линию:
render json: { message: "Price must be greater than 0" }
или: Вы можете просто сослаться на свой [файл локали] и добавить туда свои сообщения. 1:
t(:message)
Надеюсь это поможет:)
Я нашел условный способ получить хэш ошибок одним предложением. Но он не только хакерский, но и не соответствует желаемому выходу на 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"
}