[英]ActiveModel Serializer::Pagination not working with ActionController::Parameters
設置 :
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"
}
}
但是,當我對“下一個” URL( 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
要使ActiveModel :: Serializers正常工作,必須對Rails 5參數做些其他的事情嗎?
似乎params [:page]不保存頁碼,而是一個“ hash”: { number: 1, size: 1 }
。 這就是說,你要使用的頁面數為參數page
:
def page_params
params.fetch :page, {}
end
@catalogs = Catalog.page(page_params[:number])
甚至也可以調用.per(page_params[:size])
,以使API也進行更改。
解:
在某些情況下,我遇到了嵌套的分頁參數問題。 您可以使用參數page
和per_page
代替page[number]
和page[size]
。 will_paginate
解決方案在GitHub問題上的此評論中 。 解決方案也可能是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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.