مشکل در استفاده از resources در routing

من دارم مباحث restful رو یاد میگیرم و اومدم از این کد استفاده کردم.

resources :subjects do
    member do
      get 'edit'
    end
  end

من موارد بالا رو تو rout نوشتم و اومدم برا تست سه تا لینکم تو ویوی مربوط به کنترلsubjects نوشتم

  <%= link_to("all subjects",subjects_path) %>
  <%= link_to("edit subject",edit_subject_path(2)) %>
  <%= link_to("delete subject",delete_subject_path(2)) %>

فقط لینک اول درست کار میکنه و تمام رکوردا رو نشون میده و …
لینک دوم و که میزنم ارورو

The action '2' could not be found for SubjectsController

میده و میگه که اکشن دو رو پیدا نکردم درستم میگه چون وقتی رو این لینک کلیک میکنم

 <%= link_to("edit subject",edit_subject_path(2)) %>

میاد urlامو عوض میکنه به این

http://localhost:3000/subjects/2/edit

درستش اینه

http://localhost:3000/subjects/edit/2 

و کله لینک هامم خراب کرده حتی اونایی که معمولین اینم فایل routام

چرا خود Object رو نمیدی به path به جای عدد ۲؟

فرقی نمیکنه الان اینو دادم ولی یو ار ال همونه

 <%= link_to("edit subject",edit_subject_path(subject.id)) %>

فقط هر سری ایدی عوض میشه ولی یو ار ال به فرم صحیحی نیست

خب اصن عدد نباید بدی بهش. مثلا:

 <%= link_to("edit subject",edit_subject_path(subject)) %>

این نمونه آدرسی که گذاشتی با روشی که ریلز پیش گرفته فرق می‌کنه. ریلز به صورت پیش‌فرض وقتی از member استفاده می‌کنی، اینطوری آدرس رو می‌سازه: اول resource بعد identifier و بعد action.

حال چه کنم از من پیروی کنه:smile:

راهش اینه که به صورت non-restful آدرس رو بسازی.

 get 'subjects/edit/:id', to: 'subjects#edit'

فک کنم منظورتون این بود

  get 'subjects/:id/edit', to: 'subjects#edit'
  get 'subjects/:id/delete', to: 'subjects#edit'
  get 'subjects/:id/show', to: 'subjects#show'

این روش جواب میده ولی برا هر یور ال باید بیام اینجا کد بنویسم تازه بازم وقتی کاربر میخواد یه موضوع جدید ایجاد کنه validate هام کار نمیکنه ارورم نمیده و موضوع هم ساخته نمیشه.

کلن باید از این restful استفاده کرد؟ مطلب مهمیه؟ یا …

اگه اشتباه متوجه شدم بگید. گفتی که می‌خوای آدرسی به شکل زیر بسازی

http://localhost:3000/subjects/edit/2

این آدرس چون ترتیب اجزاش پیش‌فرض ریلز نیست، باید به صورت دستی بسازیش که به همون شکلیه که بالاتر اشاره کردم. ربطش به validationها رو متوجه نمی‌شم. REST رو برای این ذکر کردم که اگه با اون پیش بری (که پیش‌فرض ریلز هم هست) راحت‌تر و سریع‌تر به نتیجه می‌رسی و دیگه نیازی نیست دستی این تغییر رو انجام بدی. مثلا آدرس زیر

http://localhost:3000/subjects/2/edit

یکی از آدرس‌هایی هست که به طور خودکار توسط

resources :subjects

تولید می‌شه.

http://localhost:3000/subjects/edit/2

این حالت قدیم بود و همه چی اوکی بود حالا که اومدم از این استفاده کردم

 resources :subjects do
        member do
          get 'edit'
        end

        member do
          get 'delete'
        end

      end

اومد url هامو تغییر داد به همون حالت پیش فرض و خوب ارور داشتم که با دستورات زیر این ارور یو ار ال یی رو برطرف کردم.

  get 'subjects/:id/edit', to: 'subjects#edit'
  get 'subjects/:id/delete', to: 'subjects#edit'
  get 'subjects/:id/show', to: 'subjects#show'

حالا وقتی میخوام یه موضوع حدید بسازم ارور نمیده و مثلا تو اکشنش گفتم اگه اوکی بود و سیو کردی برو index در غیرر اینصورت همون صفحه رو دوباره رندر کن سیو نمیکنه ولی میاد ایندکس این در صورتی که اگه از restful استفاده نکنم همچی اوکیه