Получите ссылки на страницы kaminari в формате JSON, сгенерированном сериализатором активной модели.

Я пытаюсь преобразовать @admins в JSON с помощью AdminSerializer.

#app/serializers/admin_serializer.rb
class AdminSerializer < ActiveModel::Serializer
  attributes :id, :email, :access_locked?
end

где Админы >> @admins = @search.result(:distinct => true).page(params[:page][:number]).per(10) и @search = Admin.search(params[:q])

Когда я выполняю эту команду >> ActiveModel::SerializableResource.new(@admins.to_a).as_json, я получаю желаемый JSON, но ссылки на страницы отсутствуют в полученном JSON, так как они были потеряны при преобразовании @admins в массив с использованием to_a. Однако, когда я выполняю render :json => @admins , я получаю полный JSON со ссылками на страницы, как показано на снимке экрана ниже: введите здесь описание изображения


person vipin8169    schedule 30.03.2016    source источник


Ответы (2)


В последней фиксации необходимо использовать:

resource = ActiveModel::SerializableResource.new(@admins)
resource.to_json(serialization_context: ActiveModelSerializers::SerializationContext.new(request))
person Groyoh    schedule 30.03.2016
comment
Еще одно сомнение, которое у меня есть, это то, что @admins_json = ActiveModel::SerializableResource.new(@admins.to_a).as_json возвращает мне JSON, в то время как описанный выше метод дает строку, которую я должен разобрать, используя JSON.parse() javascript. мне нужно снова вызвать to_json, чтобы преобразовать его в JSON? - person vipin8169; 30.03.2016

Я использовал kaminari, это отличная жемчужина разбивки на страницы, и я не могу добавить разбивку на страницы в ответ json, но я нашел собственный код.

#your controller#index
require 'pagination'
...your code
render json: Pagination.build_json(@posts, @comment_page, @comment_per)

# /lib/pagination.rb
class Pagination
  def self.build_json object, nested_page = 1, nested_per = 10
    ob_name = object.name.downcase.pluralize
    json = Hash.new
    json[ob_name] = ActiveModelSerializers::SerializableResource.new(object.to_a, nested_page: nested_page, nested_per: nested_per)
    json[:pagination] = {
        current_page: object.current_page,
        next_page: object.next_page,
        prev_page: object.prev_page,
        total_pages: object.total_pages,
        total_count: object.total_count
    }
    return json
  end
end
person Changwoo Rhee    schedule 29.01.2020