صفحة العنصر و will_paginate
-
21-08-2019 - |
سؤال
لدي بعض الصور التي يتم تقسيمها على الصفحات المتتالية من خلال البرنامج المساعد Will_Paginate. عندما تفتح صورة ثم العودة إلى جميع الصور باستخدام رابط ، يمكنك دائمًا العودة إلى الصفحة الأولى (على سبيل المثال ، يتم عرض الصورة في الصفحة 5 ، تقوم بفتح الصورة ، وانقر على رابط لإظهار جميع الصور وتتوقع أن تكون على صفحة 5 مرة أخرى ، لكنك في الصفحة 1).
الآن ، هل هناك أي طريقة للحصول على رقم الصفحة الذي تنتمي إليه الصورة؟
حاولت تمرير معلمة GET ، لكن هذا يعمل فقط إذا لم ينفذ المستخدم أي إجراءات أخرى (على سبيل المثال ، نشر تعليق ، تحرير الصورة ، ECC.).
المحلول
page = (number_of_records_before_RECORD / number_of_records_per_page) + 1
بعبارات أخرى. إذا كانت صورتك تحتوي على معرف 40 وكان هناك 25 سجلًا من قبل (على افتراض أن بعض السجلات قد تم حذفها) ، مع 20 سجلًا لكل صفحة:
page = (25 / 20) + 1 = 2
يمكنك حساب عدد السجلات قبل السجل المحدد باستخدام Model.count(:conditions => ['id < ?', record.id], :order => 'id')
. يعتمد الاستعلام الصحيح على مرشح الفرز الذي تنطبق عليه على هذا الجدول عند إدراج جميع الكائنات.
نصائح أخرى
يعتمد رقم الصفحة بشكل كبير على نتائج البحث. قد يحتوي بحثك على 1 أو 10 أو 100 صفحة حسب مجموعة النتائج وعدد العناصر لكل صفحة.
يمكن أن يحتوي أي رابط لـ "إظهار جميع الصور" على معلومات البحث والترقيم ، باستخدام معلمات الحصول على كما وصفتها. أو تخزين واسترداد عبر ملف تعريف الارتباط بحيث تستمر نتائج البحث حتى يقوم المستخدمون بمسح أو يختارون بحثًا جديدًا.
إليك حل آخر: Will_Paginate يستخدم فقط معلمات سلسلة الاستعلام 'Search_field' و 'page' ؛ يمكنك استخراج هذه من تجزئة القضبان. إذا قمت بتتبع أولئك الذين يستخدمون حالة الجلسة ، فيمكنك إعادة تطبيقها في رمز وحدة التحكم الخاصة بك ، عند الحاجة.
بالضبط كيف تدير ذلك يعتمد على تطبيقك. في التطبيق الذي أعمل عليه ، يكون التدفق هو أنه يمكنني التمييز بين السياق العام وسياق العضو. يدخل المستخدم سياق العضو من صفحة INDEX#العضو. لذلك قمت فقط بتعيين الجلسة [: member_context] عند الدخول إلى سياق العضو ؛ على سبيل المثال في الأعضاء#تحرير. ثم ، في فهرس الأعضاء#، لدي الرمز التالي:
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 ...
هذا يعمل بشكل رائع في طلبي.