2012-02-08 34 views
41

chênh lệch hợp lý giữa resourceresources phương phápkhác biệt giữa các phương pháp tài nguyên và các nguồn lực

Dưới đây là gì là một số ví dụ:

resource :orders, :only => [:index, :create, :show] 

> rake routes 
orders POST  /orders(.:format)   orders#create 
     GET  /orders(.:format)   orders#show 


resources :orders, :only => [:index, :create, :show] 

> rake routes 
orders GET  /orders(.:format)   orders#index 
     POST  /orders(.:format)   orders#create 
    order GET  /orders/:id(.:format)  orders#show 


resource :orders 

> rake routes 
    orders POST  /orders(.:format)   orders#create 
new_orders GET  /orders/new(.:format)  orders#new 
edit_orders GET  /orders/edit(.:format)  orders#edit 
      GET  /orders(.:format)   orders#show 
      PUT  /orders(.:format)   orders#update 
      DELETE  /orders(.:format)   orders#destroy 


resources :orders 

> rake routes 
    orders GET  /orders(.:format)   orders#index 
      POST  /orders(.:format)   orders#create 
    new_order GET  /orders/new(.:format)  orders#new 
edit_order GET  /orders/:id/edit(.:format) orders#edit 
     order GET  /orders/:id(.:format)  orders#show 
      PUT  /orders/:id(.:format)  orders#update 
      DELETE  /orders/:id(.:format)  orders#destroy 

Dường như phương pháp resource không tạo ra con đường cho index, và những người giúp đỡ trong một số trường hợp khác nhau (new_order và new_orders). Tại sao?

Trả lời

38

Trên thực tế bạn là đúng, resource không nên tạo ra một hành động chỉ số, trừ khi bạn yêu cầu action index một cách rõ ràng, theo cách này:

resource :orders, :only => [:index, :create, :show] 

Helpers nên quá khác nhau, nhưng không có nhiều như trong ví dụ của bạn, vì quy ước là sử dụng một hình thức đặc biệt với các phương pháp resource, và số nhiều với resources

resources :orders 
=> rake routes 

    orders GET  /orders(.:format)   orders#index 
      POST  /orders(.:format)   orders#create 
    new_order GET  /orders/new(.:format)  orders#new 
edit_order GET  /orders/:id/edit(.:format) orders#edit 
     order GET  /orders/:id(.:format)  orders#show 
      PUT  /orders/:id(.:format)  orders#update 
      DELETE  /orders/:id(.:format)  orders#destroy 

resource :order 
=> rake routes 
     order POST  /order(.:format)   orders#create 
    new_order GET  /order/new(.:format)  orders#new 
edit_order GET  /order/:id/edit(.:format) orders#edit 
      GET  /order/:id(.:format)  orders#show 
      PUT  /order/:id(.:format)  orders#update 
      DELETE  /order/:id(.:format)  orders#destroy 

và sự khác biệt logic được tuyên bố bạn một cách logic không thể có số nhiều cho tài nguyên trong một của bạn Trang, ví dụ: Quản trị viên hoặc bất cứ điều gì

+2

tôi nghĩ rằng bạn có nghĩa là dòng đầu tiên nói 'tài nguyên: đơn đặt hàng,: chỉ ... ' – mmcrae

+0

" Người trợ giúp cũng nên khác ": có nghĩa là bạn nhận được' new_order_path' cho 'resources' và' new_orders_path' cho 'tài nguyên '. – Adobe

+0

Sự khác biệt chính không chỉ là trang chỉ mục. - ** tài nguyên ** sẽ tạo các tuyến với trang chỉ mục và cũng sẽ yêu cầu: thông số id để chỉnh sửa, cập nhật, hủy và hiển thị các hành động ([Kiểm tra] http://guides.rubyonrails.org/routing.html#specifying -a-controller-to-use) - ** tài nguyên ** sẽ tạo các tuyến đường tương tự mà không có chỉ mục tuyến đường và không yêu cầu: id param. ([Kiểm tra] http://guides.rubyonrails.org/routing.html#singular-resources) – stopanko

91

Ở mức cao, mục đích của resource là tuyên bố rằng chỉ một trong các tài nguyên này sẽ tồn tại. Ví dụ:

resource :profile, :only => [:edit, :update] 

Là người dùng, tôi chỉ có thể cập nhật tiểu sử của riêng mình. Tôi không bao giờ có thể chỉnh sửa tiểu sử của người dùng khác, vì vậy không cần phải có sơ đồ URL như /users/1/profile/edit. Thay vào đó, tôi sử dụng /profile/edit và trình điều khiển biết sử dụng ID của người dùng hiện tại thay vì ID được chuyển trong URL (vì không có ID nào).

Đó là lý do tại sao bạn không nhận được hành động index với resource: chỉ có một tài nguyên, do đó không có ý nghĩa trong việc "liệt kê" chúng.

+0

Thú vị! Cảm ơn lời giải thích này. Vì vậy, điều này có nghĩa là chúng tôi có bộ điều khiển hồ sơ sẽ khác với bộ điều khiển người dùng? Ngoài ra nếu tôi muốn url trông giống như '/ profile/settings', tôi có thể sử dụng' collection {get 'settings'} ' – Agent47DarkSoul

Các vấn đề liên quan