سؤال

لدي تطبيق Ruby/Rails الذي يحتوي على قسمين أو ثلاثة "أقسام" رئيسية.عندما يزور المستخدم هذا القسم، أرغب في عرض بعض التنقلات الفرعية.تستخدم الأقسام الثلاثة نفس التخطيط، لذلك لا يمكنني "تشفير" التنقل في التخطيط.

يمكنني التفكير في عدة طرق مختلفة للقيام بذلك.أعتقد أنه من أجل مساعدة الناس على التصويت، سأضعها كإجابات.

هل هناك أي أفكار أخرى؟أو على ماذا تصوت؟

هل كانت مفيدة؟

المحلول

يمكنك القيام بذلك بسهولة باستخدام الأجزاء الجزئية، على افتراض أن كل قسم لديه وحدة التحكم الخاصة به.

لنفترض أن لديك ثلاثة أقسام تسمى دعامات, المستخدمين و مسؤل, ، ولكل منها وحدة التحكم الخاصة بها: PostsController, UsersController و AdminController.

في كل المقابلة views الدليل، فإنك تعلن أ _subnav.html.erb جزئي:

/app/views/users/_subnav.html.erb
/app/views/posts/_subnav.html.erb
/app/views/admin/_subnav.html.erb

في كل جزء من أجزاء الملاحة الفرعية هذه، فإنك تعلن عن الخيارات الخاصة بهذا القسم، لذلك /users/_subnav.html.erb قد تحتوي على:

<ul id="subnav">
  <li><%= link_to 'All Users', users_path %></li>
  <li><%= link_to 'New User', new_user_path %></li>
</ul>

بينما /posts/_subnav.html.erb قد تحتوي على:

<ul id="subnav">
  <li><%= link_to 'All Posts', posts_path %></li>
  <li><%= link_to 'New Post', new_post_path %></li>
</ul>

أخيرًا، بمجرد الانتهاء من ذلك، تحتاج فقط إلى تضمين subnav جزئيًا في التخطيط:

<div id="header">...</div>    
<%= render :partial => "subnav" %>
<div id="content"><%= yield %></div>
<div id="footer">...</div>

نصائح أخرى

  1. تقديم جزئي.هذا مشابه جدًا للأسلوب المساعد باستثناء أنه ربما يحتوي التخطيط على بعض عبارات if، أو يمررها إلى المساعد...

أما بالنسبة لمحتوى قوائمك الفرعية، فيمكنك الاطلاع عليه بطريقة تعريفية في كل وحدة تحكم.

class PostsController < ApplicationController
#...
protected
  helper_method :menu_items
  def menu_items
    [
      ['Submenu 1', url_for(me)],
      ['Submenu 2', url_for(you)]
    ]
  end
end

الآن عندما تقوم باستدعاء Menu_items من طريقة عرض، سيكون لديك القائمة الصحيحة للتكرار عليها لوحدة التحكم المحددة.

يبدو لي أن هذا حل أنظف من وضع هذا المنطق داخل قوالب العرض.

لاحظ أنك قد ترغب أيضًا في الإعلان عن عناصر القائمة الافتراضية (الفارغة؟) داخل ApplicationController أيضًا.

تحذير:الحيل المتقدمة قدما!

تقديم لهم جميعا.قم بإخفاء تلك التي لا تحتاج إليها باستخدام CSS/Javascript، والتي يمكن تهيئتها بشكل تافه بأي عدد من الطرق.(يمكن لجافا سكريبت قراءة عنوان URL المستخدم، ومعلمات الاستعلام، وشيء ما في ملف تعريف الارتباط، وما إلى ذلك.) يتمتع هذا بميزة إمكانية اللعب بشكل أفضل بكثير مع ذاكرة التخزين المؤقت الخاصة بك (لماذا يتم تخزين ثلاث طرق عرض مؤقتًا ثم يتعين عليك إنهاء صلاحيتها جميعًا في وقت واحد عندما يمكنك تخزين واحدة مؤقتًا) ?)، ويمكن استخدامها لتقديم تجربة أفضل للمستخدم.

على سبيل المثال, ، لنفترض أن لديك واجهة شريط علامات تبويب مشتركة مع التنقل الفرعي.إذا قمت بعرض محتوى علامات التبويب الثلاث (أي.مكتوبة بتنسيق HTML) وقم بإخفاء اثنتين منها، والتبديل بين علامتي التبويب هو أمر تافه لجافا سكريبت و لا يصل حتى إلى الخادم الخاص بك.فوز كبير!لا الكمون للمستخدم.لا يوجد تحميل الخادم بالنسبة لك.

يريد فوز كبير آخر؟يمكنك استخدام شكل مختلف من هذه التقنية للغش في الصفحات التي قد تكون شائعة بنسبة 99% بين المستخدمين ولكنها لا تزال تحتوي على حالة المستخدم.على سبيل المثال، قد تكون لديك صفحة أولى لموقع ما وهي شائعة نسبيًا بين جميع المستخدمين ولكنك تقول "مرحبًا بوب" عند تسجيل الدخول.ضع الجزء غير المشترك ("Hiya, Bob") في ملف تعريف الارتباط.اطلب من قراءة هذا الجزء من الصفحة عبر جافا سكريبت قراءة ملف تعريف الارتباط. قم بتخزين الصفحة بأكملها مؤقتًا لـ جميع المستخدمين بغض النظر عن حالة تسجيل الدخول في التخزين المؤقت للصفحة. وهذا قادر فعليًا على قطع 70% من عمليات الوصول من مكدس Rails بأكمله في بعض المواقع.

من يهتم إذا كان يمكن لـ Rails التوسع أم لا عندما يكون موقعك هو Nginx الذي يقدم أصولًا ثابتة مع صفحات HTML جديدة يتم تسليمها أحيانًا بواسطة بعض روبي التي تعمل عند كل ألف وصول أو نحو ذلك؛)

يمكنك استخدام شيء مثل البرنامج المساعد للتنقل على http://rpheath.com/posts/309-rails-plugin-navigation-helper

إنه لا يقوم بالتنقل بين الأقسام الفرعية خارج الصندوق، ولكن مع القليل من التغيير والتبديل، ربما يمكنك إعداده للقيام بشيء مماثل.

أقترح عليك استخدام الجزئيات.هناك عدة طرق يمكنك القيام بها.عندما أقوم بإنشاء أجزاء جزئية تكون صعبة الإرضاء بعض الشيء لأنها تحتاج إلى متغيرات محددة، أقوم أيضًا بإنشاء طريقة مساعدة لها.

module RenderHelper
  #options: a nested array of menu names and their corresponding url
  def render_submenu(menu_items=[[]])
    render :partial => 'shared/submenu', :locals => {:menu_items => menu_items}
  end
end

الآن يحتوي الجزء الجزئي على متغير محلي يسمى Menu_items والذي يمكنك التكرار عليه لإنشاء القائمة الفرعية الخاصة بك.لاحظ أنني أقترح مصفوفة متداخلة بدلاً من التجزئة لأن ترتيب التجزئة لا يمكن التنبؤ به.

لاحظ أن المنطق الذي يحدد العناصر التي يجب عرضها في القائمة يمكن أن يكون أيضًا داخل render_submenu إذا كان ذلك أكثر منطقية بالنسبة لك.

لقد طرحت نفس السؤال تقريبًا على نفسي: احتاج الى نصيحة:هيكل طرق عرض Rails للقوائم الفرعية؟ ربما كان الحل الأفضل هو استخدام الأجزاء الجزئية.

هناك طريقة أخرى ممكنة للقيام بذلك:تخطيطات متداخلة

لا أتذكر أين وجدت هذا الكود لذا أعتذر للمؤلف الأصلي.

قم بإنشاء ملف يسمى Nested_layouts.rb في مجلد lib الخاص بك وقم بتضمين الكود التالي:

module NestedLayouts
  def render(options = nil, &block)
    if options
      if options[:layout].is_a?(Array)
        layouts = options.delete(:layout)
        options[:layout] = layouts.pop
        inner_layout = layouts.shift
        options[:text] = layouts.inject(render_to_string(options.merge({:layout=>inner_layout}))) do |output,layout|
          render_to_string(options.merge({:text => output, :layout => layout}))
        end
      end
    end
    super
  end
end

ثم قم بإنشاء تخطيطاتك المتنوعة في مجلد التخطيطات (على سبيل المثال "admin.rhtml" و"application.rhtml").

الآن في وحدات التحكم الخاصة بك أضف هذا داخل الفصل مباشرةً:

include NestedLayouts

وأخيرًا، في نهاية أفعالك، قم بما يلي:

def show
  ...
  render :layout => ['admin','application']
end

ترتيب التخطيطات في المصفوفة مهم.سيتم عرض تخطيط المسؤول داخل تخطيط التطبيق أينما كان "yeild".

يمكن أن تعمل هذه الطريقة بشكل جيد اعتمادًا على تصميم الموقع وكيفية تنظيم العناصر المختلفة.على سبيل المثال، يمكن أن يحتوي أحد التخطيطات المضمنة على سلسلة من divs التي تحتوي على المحتوى الذي يجب عرضه لإجراء معين، ويمكن لـ CSS في التخطيط الأعلى التحكم في مكان وضعها.

هناك طرق قليلة لهذه المشكلة.

قد ترغب في استخدام تخطيطات مختلفة لكل قسم.

قد ترغب في استخدام جزء مضمن في جميع طرق العرض في دليل معين.

قد ترغب في استخدام content_for يتم ملؤه بطريقة عرض أو جزئية، ويتم استدعاؤه في التخطيط العام، إذا كان لديك واحد.

أنا شخصياً أعتقد أنه يجب عليك تجنب المزيد من التجريد في هذه الحالة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top