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を次のように書きました:

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

ただし、url のリンクは、will_paginate ヘルパーにある「/products/page/:page」に変更されません。それらはまだ「products?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

現在の回答に少し追加して、それを理解するのに何時間も費やさなければなりませんでした。

たとえば、私の場合にフィルタリングを含めるなど、より複雑なルートがある場合は、「より高いレベルの」ルートが最初に来ることを確認してください(RESTful ルートの上にあるだけでなく)。 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

これで、 wallpapers/page/2?filter=popularの代わりにwallpapers /popular/page/2のようなきれいな URL を取得できます。

于 2010-06-02T09:54:39.110 に答える
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 に答える
0

これを行う:

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

You can even do it with a has_many ie: products has_many :items

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

Then your controller could look like

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

Which would give you a url like: http://domain.com/products/123/page/3 where 123 is the product id and 3 is the page id. You could also use permalinks and have the 123 id changed to a more seo friendly word.

于 2010-03-26T01:48:49.463 に答える