كيفية إعادة تسمية الافتراضي المعرف المعلمة "id" في القضبان' خريطة.الموارد()?

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

سؤال

أنا أحب كل الافتراضي الطرق التي يتم إنشاؤها بواسطة السكك الحديدية خريطة.الموارد.ولكن هناك حالات حيث كنت ترغب في استخدام غير معرف رقمي في الطرق.على سبيل المثال, إذا كان لديك متداخلة الطريق تتكون من المستخدمين المواد القياسية الطريق يمكن أن تكون مكتوبة على هذا النحو:

map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id'

ومع ذلك ، هناك العديد من المزايا / أسباب عدم استخدام الافتراضي العددية معرف الناتجة عن القضبان.هل هناك طريقة استبدال الافتراضي :id params إلى آخر الكنسي معرف خياري دون مما أدى إلى كتابة مخصص طرق كل معيار العمل ؟ نقول إذا أريد طريقا في الشكل التالي:

'/users/:login/articles/:id'

هو هذا النوع من الطرق التي يمكن تحقيقها باستخدام خريطة.الموارد?

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

المحلول

كما من القضبان 2.3 ، فإنه ليس من الممكن تغيير اسم المعلمة و لا تزال تستخدم التوجيه التلقائي التي #resources يوفر.

كحل مؤقت يمكنك خريطة articles مع :path_prefix و :name_prefix:

map.resources :articles, :path_prefix => "/users/:login",
                         :name_prefix => "user_"

على :path_prefix يؤثر على URL ، :name_prefix يؤثر ولدت اسمه طرق, لذلك عليك في نهاية المطاف مع هذه الطرق:

    user_articles GET    /users/:login/articles(.:format)          {:controller=>"articles", :action=>"index"}
                  POST   /users/:login/articles(.:format)          {:controller=>"articles", :action=>"create"}
 new_user_article GET    /users/:login/articles/new(.:format)      {:controller=>"articles", :action=>"new"}
edit_user_article GET    /users/:login/articles/:id/edit(.:format) {:controller=>"articles", :action=>"edit"}
     user_article GET    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"show"}
                  PUT    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"update"}
                  DELETE /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"destroy"}

وكقاعدة عامة من الإبهام, على الرغم من, كنت العصا مع القضبان الافتراضي اتفاقية :user_id, مع التوجيه الذي نشر في سؤالك.إنه من المفهوم عموما أن :id و :user_id لا ينطوي بالضرورة على "معرف رقمي" — أنها تعني "معرف الموارد," أيا كان ذلك قد يكون.و من خلال إصرارها على الافتراضي الاتفاقية الكود الخاص بك سوف يكون من الأسهل فهم لأي شخص استخدام الموارد طرق في القضبان.

استخدام غير معرف رقمي من أجل الموارد ، مجرد تعريف #to_param في النموذج الخاص بك.ثم تأكد من استخدام الباحث في وحدة التحكم الخاصة بك التي سوف تجد من خلال هذا المعرف (بدلا من هوية رقمية) ، مثل User#find_by_login!.

نصائح أخرى

يمكنك تغيير الافتراضي باستخدام معرف في عناوين المواقع عن طريق تجاوز to_param في النموذج الخاص بك.على سبيل المثال

class User < ActiveRecord::Base
  def to_param
    login
  end
end

user_articles_path(@user) => "/users/:login/articles"

فقط تغيير آخر سوف تحتاج إلى جعل للعثور على المستخدمين عن طريق تسجيل الدخول بدلا من معرف في وحدات التحكم الخاصة بك.

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