Как я могу изменить формат ссылки в will_paginate для page_cache в Ruby on Rails? - PullRequest
4 голосов
/ 12 января 2010

Я хочу использовать 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

Я написал route.rb выглядит так:

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

Но ссылки на URL не изменяются на «/ products / page /: page», которые находятся в помощнике will_paginate. Они все еще "продукты? Page = 2"

Как я могу изменить формат URL в will_paginate?

Ответы [ 4 ]

6 голосов
/ 12 января 2010

Объявлен ли этот маршрут выше каких-либо маршрутов ресурсов 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
1 голос
/ 02 июня 2010

Небольшое дополнение к текущим ответам, мне пришлось потратить часы, чтобы понять это.

Если у вас есть более сложные маршруты, такие как, например, фильтрация в моем случае, убедитесь, что маршруты «более высокого уровня» идут первыми (а не только что они находятся выше 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 = популярный

1 голос
/ 20 января 2010

это работает для меня

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 голосов
/ 26 марта 2010

Сделайте это:

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

Что даст вам URL, например: http://domain.com/products/123/page/3, где 123 - идентификатор продукта, а 3 - идентификатор страницы. Вы также можете использовать постоянные ссылки и изменить идентификатор 123 на более понятное для SEO слово.

...