我想知道是否有人可以告诉我 will_paginate 是否可以开箱即用地支持 JSON,或者这是否必须被破解?
我想在 will_paginate 管理分页时将页面数据添加到 JSON 响应中。
我想知道是否有人可以告诉我 will_paginate 是否可以开箱即用地支持 JSON,或者这是否必须被破解?
我想在 will_paginate 管理分页时将页面数据添加到 JSON 响应中。
类似的东西:
@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
一旦你确定了你想要的格式,你总是可以to_json
在 WillPaginate::Collection 上定义一个方法。
向 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
这对我有帮助:
将此方法添加到您的基本 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)
最简单的解决方案
def index
@posts = Post.all.paginate(:page => params[:page], :per_page => 4)
render :json => @posts.to_json(:methods => [:image_url])
end
你只需要添加gem 'will_paginate'
这个对我有用。
will_paginate 只是以切片方式获取记录。所以它只是从你的数据库中获取一个数组。
当您渲染为 json 时,这就是遍历对象数组并在它们上调用 as_json 的轨道。
所以是的,你可以将 will_paginate 渲染为 json。
我建议您观看此 Railscast:使用 AJAX 分页
宝石: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