اسم المعلمة والقيمة (بشكل مستقل) كجزء من القضبان الطريق

StackOverflow https://stackoverflow.com/questions/339706

  •  19-08-2019
  •  | 
  •  

سؤال

وDocumentsController # common_query يمكن التعامل مع العديد من الأنماط طلب مختلفة.

وأي بمعنى. جميع المستندات دفعة واحدة 4 أو جميع مستندات الموسومة "سعيد"

وأريد طريق واحد لجعل م جدا، لذلك:

و/ وثائق / common_query؟ دفعة = 4

و/ وثائق / common_query؟ العلامة = سعيد

وتصبح:

و/ وثائق / دفعة / 4

و/ وثائق / العلامة / سعيد

وهكذا والنتيجة النهائية هي أن #common_query يسمى ولكن تم استخدام جزء من عنوان الموقع مثل اسم المعلمة وجزء كما انها قيمة.

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

المحلول

وأما مسار واحد:

ActionController::Routing::Routes.draw do |map|
  map.connect "documents/:type/:id", :controller => "documents_controller", 
              :action => "common_query"
end

وبعد ذلك إما أن params[:type] "batch" أو "tag"، وparams[:id] إما "4" أو "happy". سيكون لديك للتأكد من أن إجراءات أخرى لDocumentsController تأتي قبل ذلك في الطرق لأن هذا سوف تطابق اي موقع يشبه "documents/*/*".

ولكن لماذا عليها أن تكون طريقا واحدة؟ هل يمكن استخدام طريقين مثل هذا:

map.with_options(:controller => "documents_controller", 
                 :action => "common_query") do |c|
  c.connect "documents/batch/:page", :type => "batch"
  c.connect "documents/tag/:tag",    :type => "tag"
end

والذي سوف يكون له نفس التأثير، ولكن أكثر تحديدا، لذلك كنت لا داعي للقلق حول ترتيب أولويات الطرق.

نصائح أخرى

وأما الخيار الثاني، مع اثنين من الطرق، ويكاد يكون من المؤكد أن أفضل طريقة للذهاب، لأنها ستكون مباراة فقط أنواع عناوين URL التي تريد دعم، في حين أن الخيار الأول وأيضا "تطابق" عناوين مثل / وثائق / فو / بار، والتي من المرجح أن يسبب طريقة #common_query ل، في أحسن الأحوال، بإرجاع (404) استجابة RecordNotFound. في أسوأ الأحوال، إذا لم تكن مستعدا لعدم رؤية أي من بارامس الخاص بك هو متوقع، سوف تحصل على خطأ 500 بدلا من ذلك ...

وبطبيعة الحال، إذا قمت بتشغيل وجود الكثير من الاختلافات، وينتهي بك الأمر مع الكثير من الطرق. وإذا كنت بحاجة إلى استخدامها في الجمع، على سبيل المثال، / وثائق / دفعة / 4 / العلامة / سعيدة، فإنك ستحتاج إلى استخدام طريق البدل، والقيام بتجهيز المعلمة في وحدة التحكم الخاصة بك. هذا قد تبدو شيئا مثل:

map.connect 'documents/*specs', :controller => "documents_controller", :action => "common_query"

والعناصر المختلفة للURL سيكون متاحا حدة التحكم الخاصة بك كما بارامس [المواصفات]. كنت قد يتحول ذلك إلى اكتشاف مثل ذلك:

@items = Item.find(:all, :conditions => Hash[params[:specs]])

وهذا تجزئة [] تقنية بتحويل صفيف الأبعاد واحد من الخيارات في تجزئة القيمة الأساسية، والتي قد تكون مفيدة حتى لو كنت بحرمانها مباشرة إلى اكتشاف ().

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