2010-01-11 66 views
4

我想在will_paginate中使用page_cache。如何在Ruby on Rails中更改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幫手。 他們仍然'產品?頁面= 2'

我如何更改url格式是在will_paginate?

回答

6

該路由是否宣告以上任何RESTful資源路由?也就是說,你的路線文件應該看起來像下面這樣:

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

如果你的路由看起來是正確的,你可以嘗試猴子修補的方式will_paginate產生的頁面鏈接。它在WillPaginate::ViewHelpers#url_for(page)中這樣做。這是一些相當複雜的邏輯,以處理一些棘手的邊界情況,但你可以寫第一次嘗試簡單的版本爲您product個新版本:

# 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 
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' 
0

這樣做:

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

你甚至可以用的has_many即做:產品的has_many:項目

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更改爲更友好的單詞。

1

除了當前的答案,我不得不花上幾個小時才弄明白。

如果你有一些更復雜的路由,例如包括我的情況下的過濾,請確保「更高級別」的路由優先(而不只是它們高於RESTful路由),否則will_paginate選擇將第一個可用的參數添加到網址的末尾,並以非美麗的方式粘貼額外的參數。

所以在我的情況下,我結束了與此:

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 

所以,現在我得到相當的網址,如:壁紙/流行/頁/ 2代替壁紙/頁/ 2過濾器=受歡迎?