2012-06-13 20 views
6

Tôi đang cố gắng thay đổi các liên kết will_paginate từ định dạng /list?page=1 thành /list/page/1. Tôi có các tuyến đường được thiết lập phù hợp với điều này, nhưng will_paginate đang sử dụng chuỗi truy vấn trong liên kết thay vì kiểu URL đẹp của tôi. Làm thế nào để nói nó bằng cách khác?Làm cách nào để thay đổi URL will_paginate?

Tôi đang sử dụng will_paginate 2.3.16 và Rails 2.3.14.

Trả lời

9

will_paginate sử dụng trình trợ giúp url_for. Nếu bạn xác định các tuyến đường chứa các tham số mà nó sử dụng, nó sẽ tạo ra các url khá.

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

Hãy chắc chắn rằng, bạn xác định tuyến đường này trên bất kỳ tuyến đường mà cũng có thể phù hợp với hành động điều khiển của bạn. Thậm chí tốt hơn: loại trừ hành động chỉ mục như sau:

map.resources :lists, :except => [:index] 
+1

Cảm ơn. Tôi chỉ có tuyến đường của tôi hơi say lên! Cảm ơn câu trả lời của bạn và đây là tiền thưởng – babonk

+3

Bây giờ 'map.connect' được gọi là' match '/ list/page /: page' => 'lists # index''. Anw, có một lỗi đánh máy trên 'map.connnect' @iblue của bạn, chỉ cần nói vì bài đăng này hữu ích cho tôi: D Hãy sửa tôi nếu tôi sai, đường ray newbie – ksugiarto

+0

Bạn nói đúng. Tôi đã sửa lỗi đánh máy. – iblue

1

Bạn có nhiều lựa chọn ở đây:

1 lựa chọn: khỉ vá WillPaginate::ActionView::LinkRenderer#url, mà hiện nay có logic url sau:

def url(page) 
    @base_url_params ||= begin 
    url_params = merge_get_params(default_url_params) 
    merge_optional_params(url_params) 
    end 

    url_params = @base_url_params.dup 
    add_current_page_param(url_params, page) 

    @template.url_for(url_params) 
end 

Vì vậy, tôi tưởng tượng rằng bạn có thể làm một cái gì đó giống như "/list/page/#{page}" để thay thế.

Cách khác là triển khai đầy đủ trình kết xuất (bằng cách phân lớp WillPaginate::ViewHelpers::LinkRenderer), sau đó cung cấp nó dưới dạng :renderer => MyRendererClass khi gọi will_paginate.