ActiveModel Serializer :: Pagination无法使用ActionController :: Parameters

时间:2017-09-08 15:34:33

标签: ruby-on-rails active-model-serializers kaminari

设置

Rails 5,使用ActiveModel :: Serializer和Kaminari

示例代码

def index
  @catalogs = Catalog.page(params[:page])

  render json: @catalogs, adapter: :json_api
end

问题

params[:page]nil时,我的结果符合预期:

{
    "data": [
        {
            "id": "a020ab21-9028-4bfd-8f9c-1b735ed4734b",
            "type": "catalogs",
            "attributes": {
                "name": "First",
                "locale": "en"
            }
        }
    ],
    "links": {
        "self": "http://localhost:3000/v1/catalogs?page%5Bnumber%5D=1&page%5Bsize%5D=1",
        "next": "http://localhost:3000/v1/catalogs?page%5Bnumber%5D=2&page%5Bsize%5D=1",
        "last": "http://localhost:3000/v1/catalogs?page%5Bnumber%5D=3&page%5Bsize%5D=1"
    }
}

但是,当我对“下一个”网址(http://localhost:3000/v1/catalogs?page%5Bnumber%5D=2&page%5Bsize%5D=1)发邮差时,

我明白了:

Started GET "/v1/catalogs" for 172.18.0.1 at 2017-09-08 15:27:04 +0000
undefined method `to_i' for #<ActionController::Parameters:0x0000c68977f718>
Did you mean?  to_s
               to_h

使用Rails 5参数进行分页以使ActiveModel :: Serializers工作有什么不同吗?

2 个答案:

答案 0 :(得分:0)

看起来params [:page]不包含页码,而是#34; hash&#34;:{ number: 1, size: 1 }。也就是说,您希望使用页码作为page的参数:

 def page_params
   params.fetch :page, {}
 end

 @catalogs = Catalog.page(page_params[:number])

也许甚至可以调用.per(page_params[:size]),让API也改变它。

答案 1 :(得分:0)

解决方案:

在某些情况下,我遇到了嵌套的分页参数问题。您可以使用参数pageper_page代替page[number]page[size]this comment on GitHub issue中的will_paginate解决方案。 kaminari也可能是解决方案,因为它是序列化gem而不是分页gem的问题。

说明:

Leonel所述,请单击您要链接的链接:

localhost:3000/v1/catalogs?page%5Bnumber%5D=2

与以下相同:

localhost:3000/v1/catalogs?page[number]=2

因此您的代码应访问这些参数,例如:

params[:page][:number]

不是:

params[:page]

使用ActiveModel::Serializers从上方解决方案将创建如下链接:

localhost:3000/v1/catalogs?page=2&per_page=50

因此您可以在控制器中随意访问分页参数:

Catalog.page(params[:page]) # page number
Catalog.per(params[:per_page]) # page size