Как отправить код состояния 206 при использовании gem active_model_serializer и Rails API и will_paginate / kaminari - PullRequest
0 голосов
/ 26 февраля 2019

Я использую AMS, Rails 5.2.2 API с will_paginate gem.Он работает по мере необходимости, но код ответа 200 вместо 206

#adsresses_controller

def index
  @addresses = Address.all.paginate(page: params[:page], per_page: 25)
  json_response(@addresses, :ok, include: ['shop', 'shop.country'])
end

, где json_response - это просто метод, определенный в controllers/concerns/response.rb:

module Response
  extend ActiveSupport::Concern

  def json_response(object, status = :ok, opts = {})
    response = {json: object, status: status}.merge(opts)
    render response
  end
...
end

.Вопрос в том, какое правило лучше всего отправить правильный ответ - 200 или 206 в случае разбиения на страницы?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Решение, к которому я пришел, - добавить вспомогательный метод к controllers/concerns/response.rb, чтобы иметь возможность возвращать правильный статус для разбитого на страницы ответа:

def paginated_response_status(collection)
  collection.size > WillPaginate.per_page ? :partial_content : :ok
end

и использовать его в действиях AdressesController при необходимости:

#controllers/api/addresses_controller.rb

def index
  @addresses = Address.all
  paginate(
    json: @addresses, 
      include: ['shop', 'shop.country'],
      status: paginated_response_status(@addresses) 
  )
end

Приведенный выше пример был для will_paginate драгоценного камня и api-pagination драгоценного камня.

Надеюсь, это поможет.

0 голосов
/ 27 февраля 2019

https://guides.rubyonrails.org/layouts_and_rendering.html

2.2.12.4 Опция: status Rails автоматически генерирует ответ с правильным кодом состояния HTTP (в большинстве случаев это 200 OK).Вы можете использовать опцию: status, чтобы изменить это:

render status: 500
render status: :forbidden

Ваш код ответа

200

, потому что вы запрашиваетеэто с :ok.

Вы должны обойти это с чем-то вроде:

json_response(@addresses, 206, include: ['shop', 'shop.country'])

или

json_response(@addresses, :partial_content, include: ['shop', 'shop.country'])

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206

Код ответа об успешном выполнении частичного содержимого HTTP 206 указывает на то, что запрос выполнен успешно и в теле содержатся запрошенные диапазоны данных, как описано в заголовке Range запроса.

Таким образом, в основном это зависитпо вашему заявлению я думаю.

...