Как настроить 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"
}
Другие вопросы по тегам