روبي على القضبان: توجيه التسلسل الهرمي للشجرة من الأماكن
-
11-09-2019 - |
سؤال
لذلك لدينا نظام قديم يتتبع الأماكن مع معرفات مثل "أوروبا / فرنسا / باريس"، وأنا أقوم ببناء كحول على القضبان لتشغيل هذا إلى عناوين URL مثل http: // foobar / الأماكن / أوروبا / فرنسا / باريس. هذا الشرط غير قابل للتفاوض، وعدد المستويات الممكنة في غير محدود، ولا يمكننا الهروب من القطابق.
إعداد Routes.rb ل http: // foobar / الأماكن / أوروبا هو تافهة:
map.resources :places
... ولكن http: // foobar / الأماكن / أوروبا / فرنسا يشكو "لا يوجد إجراء استجاب لأوروبا". حاولت:
map.connect '/places/:id', :controller => 'places', :action => 'show'
... ولكن هذا يعطي نفس النتيجة، على ما يبدو: معرف ينتهي في الأول "/". كيف أجعل معرف يغطي أي شيء وكل شيء بعد "الأماكن"؟
المحلول
إلقاء نظرة على دليل التوجيه للوثائق الكاملة:
http://guides.rubyonrails.org/routing.html.
على وجه التحديد قسم "4.9 الطريق العالم".
لكنني أعتقد أن ما تريد فعله حقا هو إعلان طريقك مثل:
map.connect '/places/*id', :controller => 'places', :action => 'index'
دعا مع عنوان URL مثل
/places/foo/bar/1
Yields a params[:id] => ["foo", "bar", "1"]
ما يمكنك بسهولة (إعادة) الانضمام إلى "/" لإحداث السلسلة الكاملة التي تريدها "FOO / BAR / 1" (من المحتمل أن تضطر إلى إعادة إدراج الأقطار الرائدة يدويا.
هذا الأمر سيدفعك للذهاب.
نصائح أخرى
تعديل إجابة كودي أعلاه قليلا للتوصل إلى هذا:
map.place '/places/*id', :controller => 'places', :action => 'show'
map.connect '/places/*id.:format', :controller => 'places', :action => 'show'
باستخدام MAP.Place بدلا من الخريطة. يعرف القضبان، ما المورد الذي نتعامل معه وإنشائه place_url
, place_path
إلخ المساعدة بشكل صحيح.
الآن، الخط الثاني ينبغي العمل ولكن لا بفضل الخطأ أعلاه، إذن إليك حل عبارة عن عبارة عن toil_controller.rb التي تقسم المعرف يدويا وتعيين التنسيق، الافتراضي إلى XML:
id, suffix = params[:id].join('/').split('.')
params[:format] = suffix ? suffix : "xml"