2009-04-22 52 views
54

Sau khi tôi tạo một giàn giáo, Rails cho tôi khả năng POST tới items.xml sẽ tạo một item mới. GET đến items.xml sẽ chỉ liệt kê tất cả. Rails chỉ định phương thức nào trong bộ điều khiển (create hoặc index, tương ứng) sẽ được gọi, dựa trên loại hành động tôi đang thực hiện?Rails POST, PUT, GET

Cụ thể hơn, phương thức POST callA nhưng GET với cùng phương thức gọi URLB. Nó được chỉ định ở đâu? Rails quyết định gọi phương thức index của bộ điều khiển ở đâu?

Trả lời

88

Tôi tin rằng nó được chỉ định bởi REST. Dưới đây là một danh sách cho ya:

GET /items  #=> index 
GET /items/1  #=> show 
GET /items/new #=> new 
GET /items/1/edit #=> edit 
PUT /items/1  #=> update 
POST /items  #=> create 
DELETE /items/1  #=> destroy 

Edited để thêm để có được tất cả những tuyến đường, trong config/routes.rb, chỉ cần thêm map.resources :items

+38

Chỉ cần nhập "tuyến đường rake" để xem có gì. –

+0

Và có cách nào để xác định rõ ràng rằng tôi muốn sử dụng POST chỉ như trong ASP.NET MVC ([HttPost] thuộc tính)? – Alex

+0

Nếu bạn thực hiện một GET đến/mục, bạn sẽ đi đến hành động Index. Nếu bạn POST tới/items, bạn sẽ vào Create. –

10

Nơi tốt nhất để tìm hiểu về điều này sẽ là Routing Guide.

+0

Tôi đã cố gắng hết sức để thay thế các liên kết bị hỏng. Vui lòng kiểm tra và đảm bảo rằng tôi đã liên kết với đúng trang. Cảm ơn. –

5

Giống như Don Werve đã nói, hãy xem tệp routes.rb của bạn. Trong đó bạn có thể có một cái gì đó như thế này:

map.resources :items 

Đây là nơi đường ray liên kết các yêu cầu POST và GET đến một số hành động nhất định. Để xem cách hoạt động này nhìn vào các liên kết từ các câu trả lời khác. Các tài liệu giúp một tấn.

Để tất cả các tuyến đường và hành động nào chúng liên kết đến bạn có thể nhập rake routes vào dấu nhắc lệnh khi bạn ở trong thư mục gốc của đường ray. Điều này sẽ cho bạn thấy tất cả mọi thứ (về định tuyến) mà một giàn giáo cung cấp cho bạn.

5

Điều này sẽ giúp ích rất nhiều, nhưng đó không phải là câu trả lời trực tiếp cho câu hỏi của bạn. Lệnh sau sẽ liệt kê các ánh xạ mà ứng dụng của bạn sử dụng để bạn không phải nhớ tất cả các chi tiết hoặc phỏng đoán.

$ rake routes 

Để trả lời trực tiếp hơn, đây là quy ước mà đường ray sử dụng. Bạn đặt bản đồ này lên khi bạn đặt một cái gì đó như sau trong routes.rb của bạn

map.resources :items 
27

Rails định nghĩa Bảy phương pháp điều khiển cho nguồn tài nguyên RESTful theo quy ước. Chúng là:

 
Action HTTP Method Purpose 
------------------------------------------------------------------------- 
index GET   Displays a collection of resources 
show  GET   Displays a single resource 
new  GET   Displays a form for creating a new resource 
create POST   Creates a new resource (new submits to this) 
edit  GET   Displays a form for editing an existing resource 
update PUT   Updates an existing resource (edit submits to this) 
destroy DELETE  Destroys a single resource 

Lưu ý rằng vì trình duyệt web thường chỉ hỗ trợ GET và POST, Rails sử dụng trường ẩn để chuyển các yêu cầu này thành PUT và DELETE nếu thích hợp.

Chỉ định map.resources :items trong config/routes.rb giúp bạn có 7 phương pháp "miễn phí". Bạn có thể liệt kê tất cả các tuyến đường trong ứng dụng của mình bất kỳ lúc nào bằng cách nhập rake routes vào bảng điều khiển.

+0

Ngoài ra, bạn có thể kiểm tra mã nguồn để "tái tạo" bất kỳ hành vi nào: [tài nguyên Rails v3.2.9] (https://github.com/rails/rails/blob/v3.2.9/actionpack/lib/action_dispatch/ routing/mapper.rb # L984) tại actionpack/lib/action_dispatch/routing/mapper.rb – brutuscat

3

map.resources là phương pháp tự động cung cấp cho bạn các tuyến đường REST và trình trợ giúp đường dẫn. Đây là một tính năng tuyệt vời nếu bạn đã biết và hiểu cách định tuyến hoạt động ổn định của đường ray nhưng nó cũng là một trở ngại cho việc học đường ray vì quá nhiều ẩn.

Railsguides có số đẹp routes guide.

6

Bạn có muốn biết cách chỉ sử dụng POST không? Thực hiện việc này, ví dụ:

resources :items, :only => [:create] 

..etc. Điều này là dành cho Rails 3 bằng cách này, và sẽ tạo ra một nguồn duy nhất để POST tạo. Hoặc nếu bạn chỉ cần một tập hợp con thực sự nhỏ của tập REST, chỉ:

match 'items/:id' => "items#create', :via => :post 

vv vv

1

Thành thật mà nói, bạn có thể không thực sự đi sai với các tài liệu định tuyến trên trang web Rails. Điều này đã giúp thực hiện các bước tiếp theo và vượt ra ngoài sự thoải mái của tài nguyên (mà đối với hầu hết các ứng dụng là tốt) và thực sự đinh xuống các tính năng định tuyến vững chắc có sẵn.

http://guides.rubyonrails.org/routing.html