2009-06-30 25 views
7

Tôi có một số ảnh được chia trên các trang liên tiếp thông qua plugin will_paginate. Khi bạn mở ảnh rồi quay lại tất cả ảnh bằng liên kết, bạn luôn quay lại trang đầu tiên (ví dụ: ảnh được hiển thị trên trang 5, bạn mở ảnh, nhấp vào liên kết để hiển thị tất cả ảnh và mong rằng bạn đang bật trang 5 lần nữa, nhưng bạn đang ở trang 1).Trang của mục và will_paginate

Bây giờ, có phương pháp nào để lấy số trang mà ảnh thuộc về không?

Tôi đã cố gắng chuyển thông số GET, nhưng điều này chỉ hoạt động nếu người dùng không thực hiện thêm bất kỳ hành động nào (ví dụ: đăng nhận xét, chỉnh sửa ảnh, ecc.).

Trả lời

8
page = (number_of_records_before_RECORD/number_of_records_per_page) + 1 

Nói cách khác. Nếu ảnh của bạn có ID 40 và có 25 hồ sơ trước (giả sử một số hồ sơ đã bị xóa), với 20 hồ sơ mỗi trang:

page = (25/20) + 1 = 2 

Bạn có thể đếm số lượng hồ sơ trước khi kỷ lục được lựa chọn sử dụng Model.count(:conditions => ['id < ?', record.id], :order => 'id'). Truy vấn phù hợp phụ thuộc vào bộ lọc sắp xếp mà bạn áp dụng cho bảng đó khi liệt kê tất cả các đối tượng.

+0

Đây có thể là giải pháp, nhưng tôi tự hỏi tại sao mã này không được triển khai theo mặc định trong plugin. không có ý nghĩa để làm những gì tôi nói về hiệu suất .. – collimarco

+0

Becau nó không thực sự có ý nghĩa đối với một đối tượng rộng lớn. Đây không phải là giải pháp hoàn hảo mà chỉ là giải pháp cho nhu cầu cụ thể của bạn. Ngoài ra, will_paginate cung cấp các cơ sở phân trang, chứ không phải các chức năng ActiveRecord bổ sung. –

+1

Tôi sẽ không nghĩ rằng nó sẽ là một hit hiệu suất rất lớn. Khi bạn đang sử dụng một thư viện pagination nó sẽ đếm tất cả những điều bạn đang phân trang để có được tổng số trang.Miễn là cột bạn đang đặt hàng được lập chỉ mục chính xác thì không nên quá đau đớn để có được một số lượng tương tự để tìm trang hiện tại. – Shadwell

0

Số trang phụ thuộc nhiều vào kết quả tìm kiếm của bạn. Tìm kiếm của bạn có thể có 1, 10 hoặc 100 trang tùy thuộc vào tập hợp kết quả và số lượng mục trên mỗi trang.

Bất kỳ liên kết nào đến "hiển thị tất cả ảnh" đều có thể chứa thông tin tìm kiếm và phân trang, bằng cách sử dụng các tham số GET như bạn đã mô tả. Hoặc lưu trữ và truy xuất qua cookie để kết quả tìm kiếm vẫn tồn tại cho đến khi người dùng xóa hoặc chọn tìm kiếm mới.

+0

Vấn đề là khi người dùng tạm thời rời khỏi trang ảnh (ví dụ sửa đổi nó) và sau đó cố gắng quay trở lại để hiển thị tất cả ảnh, anh ấy luôn quay lại trang đầu tiên: ( Mặc dù tôi không nghĩ rằng việc sử dụng cookie là một điều tốt cho SEO – collimarco

+1

@collimarco Nếu bạn muốn sử dụng lại các tham số tìm kiếm và paginations giữa các yêu cầu, thì bạn sẽ cần phải lưu giữ chúng ở đâu đó. –

+0

Tôi thấy rằng nhiều trang web nhiếp ảnh (như deviantart.com) sử dụng cookie để cho phép người dùng quay lại – collimarco

0

Đây là một giải pháp khác: will_paginate chỉ sử dụng tham số chuỗi truy vấn 'search_field' và 'page'; bạn có thể trích xuất chúng từ băm params Rails. Nếu bạn theo dõi những người sử dụng trạng thái phiên, bạn có thể áp dụng lại chúng trong mã điều khiển của bạn, khi cần thiết.

Chính xác cách bạn quản lý sẽ tùy thuộc vào đơn đăng ký của bạn. Trong ứng dụng tôi đang làm việc, luồng là như vậy mà tôi có thể phân biệt giữa bối cảnh chung và bối cảnh thành viên. Người dùng nhập ngữ cảnh thành viên từ trang thành viên # index. Vì vậy, tôi chỉ cần thiết lập phiên [: member_context] khi nhập vào ngữ cảnh thành viên; ví dụ. trong các thành viên # chỉnh sửa. Sau đó, trong chỉ mụC# thành viên, tôi có mã sau:

if session[:member_context] 
    @search_field = session[:search_field] 
    @page = session[:page] 
    # toggle out of member context 
    session[:member_context] = nil 
else 
    @search_field = params[:search_field] 
    @page = params[:page] 
    # record lastest search in case the user subsequently enters the member context 
    session[:search_field] = @search_field 
    session[:page] = @page 
end 
@members = Member.where(<use @search_field>).page(@page) 
# and render ... 

Điều này rất hữu ích trong ứng dụng của tôi.

Các vấn đề liên quan