设置:
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工作有什么不同吗?
答案 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)
解决方案:
在某些情况下,我遇到了嵌套的分页参数问题。您可以使用参数page
和per_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