簡體   English   中英

ActiveModel Serializer :: Pagination無法與ActionController :: Parameters一起使用

[英]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也進行更改。

解:

在某些情況下,我遇到了嵌套的分頁參數問題。 您可以使用參數pageper_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM