首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Ruby on Rails中更改will_paginate中page_cache的链接格式?

如何在Ruby on Rails中更改will_paginate中page_cache的链接格式?
EN

Stack Overflow用户
提问于 2010-01-12 07:25:43
回答 4查看 3.5K关注 0票数 4

我想在will_paginate中使用page_cache。

在下面的页面上有很好的信息。

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

我写的routes.rb看起来像这样:

代码语言:javascript
复制
map.connect '/products/page/:page', :controller => 'products', :action => 'index'

但是,url的链接不会更改为will_paginate帮助程序中的“/products/page/:page”。他们仍然是“products?page=2”

如何更改will_paginate中的url格式?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-12 21:19:55

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

代码语言:javascript
复制
map.connnect '/products/page/:page', :controller => 'products', :action => 'index'
map.resources :products, :except => [:index]

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

代码语言:javascript
复制
# 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
票数 6
EN

Stack Overflow用户

发布于 2010-01-21 03:45:23

这对我很管用

代码语言:javascript
复制
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文件

代码语言:javascript
复制
WillPaginate::ViewHelpers.pagination_options[:renderer] = 'CustomLinkRenderer'
票数 1
EN

Stack Overflow用户

发布于 2010-06-02 17:54:39

除了目前的答案之外,我不得不花几个小时才能弄清楚。

如果你有一些更复杂的路由,例如在我的例子中包括过滤,确保“更高级别”的路由首先出现在上(而不仅仅是它们在RESTful路由之上),否则will_paginate会选择第一个可用的路由,并以一种不美观的方式将额外的参数粘贴到的末尾。

所以在我的例子中,我最终得到了这个:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2045694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档