4

我想将 page_cache 与 will_paginate 一起使用。

下面这个页面上有很好的信息。

http://railsenvy.com/2007/2/28/rails-caching-tutorial#pagination http://railslab.newrelic.com/2009/02/05/episode-5-advanced-page-caching

我写的 routes.rb 看起来像:

map.connect '/products/page/:page', :controller => 'products', :action => 'index'

但是,url 的链接不会更改为 will_paginate 助手中的“/products/page/:page”。它们仍然是“产品?page=2”

如何更改 will_paginate 中的 url 格式?

4

4 回答 4

6

该路由是否声明任何 RESTful 资源路由之上?也就是说,您的路由文件应如下所示:

map.connnect '/products/page/:page', :controller => 'products', :action => 'index'
map.resources :products, :except => [:index]

如果您的路线看起来正确,您可以尝试使用猴子补丁will_paginate生成页面链接的方式。它在WillPaginate::ViewHelpers#url_for(page). 为了处理一些棘手的边缘情况,这是一些相当复杂的逻辑,但您可以编写一个新版本,product首先为您的 s 尝试简单版本:

# in lib/cache_paginated_projects.rb
WillPaginate::ViewHelpers.class_eval do
  old_url_for = method(:url_for)
  define_method(:url_for) do |page|
    if @template.params[:controller].to_s == 'products' && @template.params[:action].to_s == 'index'
      @template.url_for :page => page
    else
      old_url_for.bind(self).call(page)
    end
  end
end
于 2010-01-12T13:19:54.623 回答
1

这对我有用

app/helpers/custom_link_renderer.rb

class CustomLinkRenderer < WillPaginate::LinkRenderer
  def page_link(page, text, attributes = {})
    @template.link_to text, "#{@template.url_for(@url_params)}/page/#{page}", attributes
  end
end

将此行添加到config/environment.rb文件

WillPaginate::ViewHelpers.pagination_options[:renderer] = 'CustomLinkRenderer'
于 2010-01-20T19:45:22.573 回答
1

除了当前的答案之外,我不得不花费数小时来弄清楚。

如果您有一些更复杂的路由,例如在我的情况下包括过滤,请确保首先出现“更高级别”的路由(而不仅仅是它们高于 RESTful 路由),否则 will_paginate 会选择第一个可用的路由并且以不漂亮的方式将额外的参数粘贴在 URL 的末尾。

所以就我而言,我最终得到了这个:

map.connect "wallpapers/:filter/page/:page", :controller => "wallpapers", :action => "index", :requirements => {:page => /\d+/, :filter => /(popular|featured)/ }
map.connect "wallpapers/page/:page", :controller => "wallpapers", :action => "index", :requirements => {:page => /\d+/ }
map.resources :wallpapers

所以现在我得到了漂亮的 URL,比如:wallpapers/popular/page/2而不是wallpapers/page/2?filter=popular

于 2010-06-02T09:54:39.110 回答
0

做这个:

map.products_with_pages "/products/page/:page", :controller => "products", :action => "index"

你甚至可以用 has_many 来做到这一点,即: products has_many :items

map.resources :products do |product|
  map.items_with_pages "/products/:id/page/:page", :controller => "products", :action => "show"
end

然后你的控制器可能看起来像

def show
  product = Product.find(params[:id])
  @items = product.items.paginate :per_page => 5, :page => params[:page]
end

这会给你一个类似的网址: http: //domain.com/products/123/page/3其中 123 是产品 ID,3 是页面 ID。您还可以使用永久链接并将 123 id 更改为对 seo 更友好的词。

于 2010-03-26T01:48:49.463 回答