كيفية إعادة تسمية الافتراضي المعرف المعلمة "id" في القضبان' خريطة.الموارد()?
-
03-07-2019 - |
سؤال
أنا أحب كل الافتراضي الطرق التي يتم إنشاؤها بواسطة السكك الحديدية خريطة.الموارد.ولكن هناك حالات حيث كنت ترغب في استخدام غير معرف رقمي في الطرق.على سبيل المثال, إذا كان لديك متداخلة الطريق تتكون من المستخدمين المواد القياسية الطريق يمكن أن تكون مكتوبة على هذا النحو:
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"
فقط تغيير آخر سوف تحتاج إلى جعل للعثور على المستخدمين عن طريق تسجيل الدخول بدلا من معرف في وحدات التحكم الخاصة بك.