【问题标题】:will_paginate JSON support?will_paginate JSON 支持?
【发布时间】:2011-06-09 14:37:16
【问题描述】:

我想知道是否有人可以告诉我 will_paginate 是否可以开箱即用地支持 JSON,或者这是否必须被破解?

我想在 will_paginate 管理分页时将页面数据添加到 JSON 响应中。

【问题讨论】:

    标签: ruby-on-rails ruby json gem will-paginate


    【解决方案1】:

    宝石:will_paginate,版本 3.1.8

      def pagination_meta(collection)
        {
          current_page: collection.current_page,
          next_page: collection.next_page,
          prev_page: collection.previous_page,
          total_page: collection.total_pages,
          total_count: collection.total_entries,
        } if collection.present?
      end
    

    【讨论】:

      【解决方案2】:

      最简单的解决方案

        def index
          @posts =  Post.all.paginate(:page => params[:page], :per_page => 4)
          render :json => @posts.to_json(:methods => [:image_url])
        end
      

      您只需添加gem 'will_paginate'

      它对我有用。

      【讨论】:

        【解决方案3】:

        这个对我有帮助:

        将此方法添加到您的基本 API 控制器。

        def pagination_dict(collection)
          {
            current_page: collection.current_page,
            next_page: collection.next_page,
            prev_page: collection.prev_page, # use collection.previous_page when using will_paginate
            total_pages: collection.total_pages,
            total_count: collection.total_count # use collection.total_entries when using will_paginate
          }
        end
        

        然后,在你的渲染方法上使用它。

        render json: posts, meta: pagination_dict(posts)
        

        【讨论】:

        • 这是一个死链接。
        • 谢谢你 - 我删除了网址 - 但我剪断的作品。
        【解决方案4】:

        向 API 添加分页

        我找到了一个使用 will_pagination 的 API Json 响应分页的简单解决方案。

        首先在ApplicationController 中创建一个类方法,该方法将创建一个after_filter,它将在响应标头中设置分页元数据:

        application_controller.rb

        class ApplicationController < ActionController::Base
        
          protected
          def self.set_pagination_headers(name, options = {})
            after_filter(options) do |controller|
              results = instance_variable_get("@#{name}")
              headers["X-Pagination"] = {
                total: results.total_entries,
                total_pages: results.total_pages,
                first_page: results.current_page == 1,
                last_page: results.next_page.blank?,
                previous_page: results.previous_page,
                next_page: results.next_page,
                out_of_bounds: results.out_of_bounds?,
                offset: results.offset
              }.to_json
            end
          end
        
        end
        

        然后在控制器中我们要添加分页标题,我们可以这样称呼它:

        widgets_controller.rb

        class Api::V1::WidgetsController < Api::V1::BaseController
          set_pagination_headers :widgets, only: [:index]
        
          def index
            @widgets = Widget.all.paginate(params).order("created_at desc")
            respond_with @widgets
          end
        
        end
        

        响应标题看起来像这样

        > Cache-Control:max-age=0, private, must-revalidate
        > Connection:keep-alive Content-Type:application/json; charset=utf-8
        > Etag:"fe70f7bae4c6e5cdea7867aa7fc0c7b4"
        > X-Pagination:{"total":14,"total_pages":1,"first_page":true,"last_page":true,"previous_page":null,"next_page":null,"out_of_bounds":false,"offset":0}
        > Server:thin 1.3.1 codename Triple Espresso
        > Set-Cookie:_widgets_session=BAh7CEkiD3Nlc3Npb25faWQGOgZFRkkiJTAzYjVlNzkwZTIyNzU4YTYwMDU0M2MwOTQ2ZWI3YWU2BjsAVEkiDWxhc3RfdXJsBjsARkkiM2h0dHA6Ly9tYWluYW5kbWUtc3RhZ2luZy5oZXJva3VhcHAuY29tL3VzZXJzLzEGOwBGSSIQX2NzcmZfdG9rZW4GOwBGSSIxdjd0SEp6cVhKamh5YTh1cnBUdmpBb0w5aVA0bS9QTEdON3g1UlFUYnBkND0GOwBG--71b3a24c216a414d8db04f312b5300c818e6bba4;
        > path=/; HttpOnly Transfer-Encoding:Identity
        > X-Request-Id:61b383ade49cba8b24a715a453ed6e1f X-Runtime:0.191485
        > X-Ua-Compatible:IE=Edge,chrome=1
        

        Source -Adding Pagination to an API

        【讨论】:

        • 这是一个很棒的 AP​​I 分页。不要修改返回的数据,将分页信息放在 headers 中。超级干净的解决方案,与 Angular 等希望返回索引/列表/查询结果数组的其他人配合得很好。
        【解决方案5】:

        以下内容:

        @posts = Post.paginate :page => params[:page]
        
        respond_to do |format|
          format.json {
            render :json => {
              :current_page => @posts.current_page,
              :per_page => @posts.per_page,
              :total_entries => @posts.total_entries,
              :entries => @posts
            }
          }
        end
        

        一旦你弄清楚你想要什么格式,你总是可以在 WillPaginate::Collection 上定义一个to_json 方法。

        【讨论】:

        • 是的,这就是我想要做的,现在我知道它是如何工作的,它可能会通过直接渲染到 JSON 返回我需要的内容,但是,能够像这样更改格式很有用。
        • 查看 GitHub API 文档[1] 以更好地在响应中编码分页(提示:将其放在标题中)[1]:developer.github.com/v3/#pagination
        • 您是如何找到这些方法的?它们没有在 will_paginate wiki 中列出。
        【解决方案6】:

        我建议你观看这个 Railscast:Pagination with AJAX

        【讨论】:

        • 我没有使用 RJS,所以数据必须在 JSON 响应中
        【解决方案7】:

        will_paginate 只是以切片方式获取记录。所以它只是从你的数据库中获取一个数组。

        当您渲染为 json 时,这就是遍历对象数组并在它们上调用 as_json 的轨道。

        所以是的,您可以将_paginate 渲染为 json。

        【讨论】:

        • 但我想我必须破解它,以便它包含 JSON 响应中的总页数以及分页数据。
        • 这一切都在 Model.paginate 的响应中——所以你只需要在 json 响应中查找它。
        • 我也会调查一下。 @mislav 提供了我正在寻找的示例,但是,我可以看到仅将标准输出呈现为 JSON 也应该包含我需要的信息。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        相关资源
        最近更新 更多