Bộ định tuyến Rails nhận ra các URL và gửi chúng tới hành động của bộ điều khiển hoặc tới ứng dụng Rack. Nó cũng có thể tạo đường dẫn và URL, tránh phải mã hóa cứng các chuỗi trong chế độ xem của bạn
1. 1 Kết nối URL với Mã
Khi ứng dụng Rails của bạn nhận được yêu cầu đến cho
nó yêu cầu bộ định tuyến khớp nó với một hành động của bộ điều khiển. Nếu tuyến đường phù hợp đầu tiên là
get '/patients/:id', to: 'patients#show'
Bản saoyêu cầu được gửi đến hành động
get '/patients/:id', to: 'patients#show', as: 'patient'
11 của bộ điều khiển get '/patients/:id', to: 'patients#show', as: 'patient'
10 với get '/patients/:id', to: 'patients#show', as: 'patient'
12 trong get '/patients/:id', to: 'patients#show', as: 'patient'
13Rails sử dụng Snake_case cho tên bộ điều khiển ở đây, nếu bạn có bộ điều khiển nhiều từ như
get '/patients/:id', to: 'patients#show', as: 'patient'
14, bạn muốn sử dụng get '/patients/:id', to: 'patients#show', as: 'patient'
15 chẳng hạn1. 2 Tạo đường dẫn và URL từ mã
Bạn cũng có thể tạo đường dẫn và URL. Nếu tuyến đường trên được sửa đổi thành
get '/patients/:id', to: 'patients#show', as: 'patient'
Bản saovà ứng dụng của bạn chứa mã này trong bộ điều khiển
@patient = Patient.find[params[:id]]
Bản saovà điều này trong chế độ xem tương ứng
Bản saosau đó bộ định tuyến sẽ tạo đường dẫn
get '/patients/:id', to: 'patients#show', as: 'patient'
16. Điều này làm giảm độ giòn của chế độ xem của bạn và làm cho mã của bạn dễ hiểu hơn. Lưu ý rằng id không cần được chỉ định trong trình trợ giúp tuyến đường1. 3 Định cấu hình Bộ định tuyến Rails
Các tuyến cho ứng dụng hoặc công cụ của bạn nằm trong tệp
get '/patients/:id', to: 'patients#show', as: 'patient'
17 và thường trông như thế nàyget '/patients/:id', to: 'patients#show', as: 'patient'
2Bản saoVì đây là tệp nguồn Ruby thông thường, bạn có thể sử dụng tất cả các tính năng của nó để giúp bạn xác định tuyến đường của mình nhưng hãy cẩn thận với các tên biến vì chúng có thể xung đột với các phương thức DSL của bộ định tuyến
Khối
get '/patients/:id', to: 'patients#show', as: 'patient'
18 bao bọc các định nghĩa tuyến đường của bạn là bắt buộc để thiết lập phạm vi cho DSL của bộ định tuyến và không được xóaĐịnh tuyến tài nguyên cho phép bạn nhanh chóng khai báo tất cả các tuyến chung cho một bộ điều khiển tài nguyên nhất định. Một cuộc gọi duy nhất tới
get '/patients/:id', to: 'patients#show', as: 'patient'
19 có thể khai báo tất cả các tuyến đường cần thiết cho các hành động get '/patients/:id', to: 'patients#show', as: 'patient'
20, get '/patients/:id', to: 'patients#show', as: 'patient'
11, get '/patients/:id', to: 'patients#show', as: 'patient'
22, get '/patients/:id', to: 'patients#show', as: 'patient'
23, get '/patients/:id', to: 'patients#show', as: 'patient'
24, get '/patients/:id', to: 'patients#show', as: 'patient'
25 và get '/patients/:id', to: 'patients#show', as: 'patient'
26 của bạn2. 1 Tài nguyên trên Web
Trình duyệt yêu cầu các trang từ Rails bằng cách yêu cầu một URL bằng một phương thức HTTP cụ thể, chẳng hạn như
get '/patients/:id', to: 'patients#show', as: 'patient'
27, get '/patients/:id', to: 'patients#show', as: 'patient'
28, get '/patients/:id', to: 'patients#show', as: 'patient'
29, get '/patients/:id', to: 'patients#show', as: 'patient'
30 và get '/patients/:id', to: 'patients#show', as: 'patient'
31. Mỗi phương thức là một yêu cầu để thực hiện một thao tác trên tài nguyên. Một tuyến tài nguyên ánh xạ một số yêu cầu liên quan đến các hành động trong một bộ điều khiển duy nhấtKhi ứng dụng Rails của bạn nhận được yêu cầu đến cho
nó yêu cầu bộ định tuyến ánh xạ nó tới một hành động của bộ điều khiển. Nếu tuyến đường phù hợp đầu tiên là
Rails sẽ gửi yêu cầu đó đến hành động
get '/patients/:id', to: 'patients#show', as: 'patient'
26 trên bộ điều khiển get '/patients/:id', to: 'patients#show', as: 'patient'
33 với get '/patients/:id', to: 'patients#show', as: 'patient'
12 trong get '/patients/:id', to: 'patients#show', as: 'patient'
132. 2 CRUD, Động từ và Hành động
Trong Rails, một tuyến tháo vát cung cấp ánh xạ giữa các động từ HTTP và URL tới các hành động của bộ điều khiển. Theo quy ước, mỗi hành động cũng ánh xạ tới một hoạt động CRUD cụ thể trong cơ sở dữ liệu. Một mục duy nhất trong tệp định tuyến, chẳng hạn như
tạo bảy tuyến đường khác nhau trong ứng dụng của bạn, tất cả ánh xạ tới bộ điều khiển
get '/patients/:id', to: 'patients#show', as: 'patient'
36HTTP VerbPathController#ActionUsed forGET/photosphotos#indexhiển thị danh sách tất cả ảnhGET/photos/newphotos#newreturn form HTML để tạo ảnh mớiPOST/photosphotos#createtạo ảnh mớiGET/photos/. idphotos#showhiển thị một ảnh cụ thểGET/photos/. id/editphotos#editreturn form HTML để chỉnh sửa ảnhPATCH/PUT/photos/. idphotos#updatecập nhật một ảnh cụ thể XÓA/ảnh/. idphotos#destroyxóa một ảnh cụ thểVì bộ định tuyến sử dụng động từ HTTP và URL để khớp với các yêu cầu gửi đến, bốn URL ánh xạ tới bảy hành động khác nhau
Các tuyến đường ray được khớp theo thứ tự chúng được chỉ định, vì vậy nếu bạn có một
get '/patients/:id', to: 'patients#show', as: 'patient'
37 phía trên một get '/patients/:id', to: 'patients#show', as: 'patient'
38 thì tuyến hành động của get '/patients/:id', to: 'patients#show', as: 'patient'
11 cho dòng get '/patients/:id', to: 'patients#show', as: 'patient'
19 sẽ được khớp trước dòng get '/patients/:id', to: 'patients#show', as: 'patient'
41. Để khắc phục điều này, hãy di chuyển dòng get '/patients/:id', to: 'patients#show', as: 'patient'
41 lên trên dòng get '/patients/:id', to: 'patients#show', as: 'patient'
19 để nó được khớp trước2. 3 Trình trợ giúp đường dẫn và URL
Tạo một tuyến đường tháo vát cũng sẽ hiển thị một số trình trợ giúp cho bộ điều khiển trong ứng dụng của bạn. Trong trường hợp của
get '/patients/:id', to: 'patients#show', as: 'patient'
37
45 trả vềget '/patients/:id', to: 'patients#show', as: 'patient'
46get '/patients/:id', to: 'patients#show', as: 'patient'
47 trả vềget '/patients/:id', to: 'patients#show', as: 'patient'
48get '/patients/:id', to: 'patients#show', as: 'patient'
49 trả vềget '/patients/:id', to: 'patients#show', as: 'patient'
50 [ví dụ:get '/patients/:id', to: 'patients#show', as: 'patient'
51 trả vềget '/patients/:id', to: 'patients#show', as: 'patient'
52]get '/patients/:id', to: 'patients#show', as: 'patient'
53 trả vềget '/patients/:id', to: 'patients#show', as: 'patient'
54 [ví dụ:get '/patients/:id', to: 'patients#show', as: 'patient'
55 trả vềget '/patients/:id', to: 'patients#show', as: 'patient'
56]get '/patients/:id', to: 'patients#show', as: 'patient'
Mỗi trình trợ giúp này có một trình trợ giúp
get '/patients/:id', to: 'patients#show', as: 'patient'
57 tương ứng [chẳng hạn như get '/patients/:id', to: 'patients#show', as: 'patient'
58] trả về cùng một đường dẫn có tiền tố là máy chủ, cổng và tiền tố đường dẫn hiện tạiNếu bạn cần tạo các tuyến đường cho nhiều tài nguyên, bạn có thể tiết kiệm một chút công việc nhập liệu bằng cách xác định tất cả chúng bằng một lệnh gọi duy nhất tới
get '/patients/:id', to: 'patients#show', as: 'patient'
19get '/patients/:id', to: 'patients#show', as: 'patient'
5Bản saoĐiều này hoạt động chính xác giống như
get '/patients/:id', to: 'patients#show', as: 'patient'
6Bản sao2. 5 tài nguyên số ít
Đôi khi, bạn có một tài nguyên mà khách hàng luôn tìm kiếm mà không cần tham chiếu ID. Ví dụ: bạn muốn
get '/patients/:id', to: 'patients#show', as: 'patient'
60 luôn hiển thị hồ sơ của người dùng hiện đang đăng nhập. Trong trường hợp này, bạn có thể sử dụng một tài nguyên duy nhất để ánh xạ get '/patients/:id', to: 'patients#show', as: 'patient'
60 [chứ không phải get '/patients/:id', to: 'patients#show', as: 'patient'
62] với hành động get '/patients/:id', to: 'patients#show', as: 'patient'
11get '/patients/:id', to: 'patients#show', as: 'patient'
1Bản saoVượt qua một
get '/patients/:id', to: 'patients#show', as: 'patient'
64 để get '/patients/:id', to: 'patients#show', as: 'patient'
65 sẽ mong đợi một định dạng get '/patients/:id', to: 'patients#show', as: 'patient'
66. Khi sử dụng một get '/patients/:id', to: 'patients#show', as: 'patient'
67, tùy chọn get '/patients/:id', to: 'patients#show', as: 'patient'
65 nên được thay thế bằng get '/patients/:id', to: 'patients#show', as: 'patient'
69. Khi sử dụng một get '/patients/:id', to: 'patients#show', as: 'patient'
64 mà không có một get '/patients/:id', to: 'patients#show', as: 'patient'
71, tùy chọn get '/patients/:id', to: 'patients#show', as: 'patient'
65 nên được thay thế bằng get '/patients/:id', to: 'patients#show', as: 'patient'
73get '/patients/:id', to: 'patients#show', as: 'patient'
2Bản saoCon đường tháo vát này
get '/patients/:id', to: 'patients#show', as: 'patient'
3Bản saotạo sáu tuyến đường khác nhau trong ứng dụng của bạn, tất cả ánh xạ tới bộ điều khiển
get '/patients/:id', to: 'patients#show', as: 'patient'
74HTTP VerbPathController#ActionUsed forGET/geocoder/newgeocoders#newtrả lại biểu mẫu HTML để tạo trình mã hóa địa lýPOST/geocodergeocoders#createtạo trình mã hóa địa lý mớiGET/geocodergeocoders#showdisplay tài nguyên trình mã hóa địa lý duy nhấtGET/geocoder/editgeocoders#editreturn biểu mẫu HTML để chỉnh sửa trình mã hóa địa lýPATCH/PUT Bởi vì bạn có thể muốn sử dụng cùng một bộ điều khiển cho một tuyến đường số ít [
get '/patients/:id', to: 'patients#show', as: 'patient'
75] và tuyến đường số nhiều [get '/patients/:id', to: 'patients#show', as: 'patient'
76], các tài nguyên số ít ánh xạ tới các bộ điều khiển số nhiều. Vì vậy, ví dụ, get '/patients/:id', to: 'patients#show', as: 'patient'
77 và get '/patients/:id', to: 'patients#show', as: 'patient'
37 tạo cả tuyến đường số ít và số nhiều ánh xạ tới cùng một bộ điều khiển [get '/patients/:id', to: 'patients#show', as: 'patient'
79]Một tuyến đường tháo vát duy nhất tạo ra những người trợ giúp này
80 trả vềget '/patients/:id', to: 'patients#show', as: 'patient'
81get '/patients/:id', to: 'patients#show', as: 'patient'
82 trả vềget '/patients/:id', to: 'patients#show', as: 'patient'
83get '/patients/:id', to: 'patients#show', as: 'patient'
84 trả vềget '/patients/:id', to: 'patients#show', as: 'patient'
85get '/patients/:id', to: 'patients#show', as: 'patient'
Cuộc gọi đến
get '/patients/:id', to: 'patients#show', as: 'patient'
86 là cần thiết để chuyển đổi các phiên bản của get '/patients/:id', to: 'patients#show', as: 'patient'
87 thành các tuyến thông qua nhận dạng bản ghiGiống như với các tài nguyên số nhiều, các trình trợ giúp tương tự kết thúc bằng
get '/patients/:id', to: 'patients#show', as: 'patient'
57 cũng sẽ bao gồm tiền tố máy chủ, cổng và đường dẫn2. 6 Không gian tên điều khiển và định tuyến
Bạn có thể muốn tổ chức các nhóm bộ điều khiển trong một không gian tên. Thông thường nhất, bạn có thể nhóm một số bộ điều khiển quản trị trong một không gian tên
get '/patients/:id', to: 'patients#show', as: 'patient'
89 và đặt các bộ điều khiển này trong thư mục get '/patients/:id', to: 'patients#show', as: 'patient'
90. Bạn có thể định tuyến đến một nhóm như vậy bằng cách sử dụng khối get '/patients/:id', to: 'patients#show', as: 'patient'
91get '/patients/:id', to: 'patients#show', as: 'patient'
0Bản saoĐiều này sẽ tạo một số tuyến đường cho từng bộ điều khiển
get '/patients/:id', to: 'patients#show', as: 'patient'
92 và get '/patients/:id', to: 'patients#show', as: 'patient'
93. Đối với get '/patients/:id', to: 'patients#show', as: 'patient'
94, Rails sẽ tạoHTTP VerbPathController#ActionNamed Route HelperGET/admin/articlesadmin/articles#indexadmin_articles_pathGET/admin/articles/newadmin/articles#newnew_admin_article_pathPOST/admin/articlesadmin/articles#createadmin_articles_pathGET/admin/articles/. idadmin/articles#showadmin_article_path[. id] NHẬN/quản trị viên/bài viết/. id/editadmin/articles#editedit_admin_article_path[. id]PATCH/PUT/admin/bài viết/. idadmin/articles#updateadmin_article_path[. id]XÓA/quản trị viên/bài viết/. idadmin/articles#destroyadmin_article_path[. Tôi]Thay vào đó, nếu bạn muốn định tuyến
get '/patients/:id', to: 'patients#show', as: 'patient'
95 [không có tiền tố get '/patients/:id', to: 'patients#show', as: 'patient'
96] đến get '/patients/:id', to: 'patients#show', as: 'patient'
94, bạn có thể chỉ định mô-đun bằng khối get '/patients/:id', to: 'patients#show', as: 'patient'
98get '/patients/:id', to: 'patients#show', as: 'patient'
1Bản saoĐiều này cũng có thể được thực hiện cho một tuyến đường duy nhất
get '/patients/:id', to: 'patients#show', as: 'patient'
2Bản saoThay vào đó, nếu bạn muốn định tuyến
get '/patients/:id', to: 'patients#show', as: 'patient'
99 đến @patient = Patient.find[params[:id]]
00 [không có tiền tố mô-đun get '/patients/:id', to: 'patients#show', as: 'patient'
89], bạn có thể chỉ định đường dẫn bằng khối get '/patients/:id', to: 'patients#show', as: 'patient'
98get '/patients/:id', to: 'patients#show', as: 'patient'
3Bản saoĐiều này cũng có thể được thực hiện cho một tuyến đường duy nhất
get '/patients/:id', to: 'patients#show', as: 'patient'
4Bản saoTrong cả hai trường hợp này, những người trợ giúp tuyến đường được đặt tên vẫn giữ nguyên như thể bạn không sử dụng
get '/patients/:id', to: 'patients#show', as: 'patient'
98. Trong trường hợp cuối cùng, các đường dẫn sau ánh xạ tới @patient = Patient.find[params[:id]]
00HTTP VerbPathController#ActionNamed Route HelperGET/admin/articlesarticles#indexarticles_pathGET/admin/articles/newarticles#newnew_article_pathPOST/admin/articlesarticles#createarticles_pathGET/admin/articles/. idarticles#showarticle_path[. id] NHẬN/quản trị viên/bài viết/. id/editarticles#editedit_article_path[. id]PATCH/PUT/admin/bài viết/. idarticles#updatearticle_path[. id]XÓA/quản trị viên/bài viết/. idarticles#destroyarticle_path[. Tôi]Nếu bạn cần sử dụng một không gian tên bộ điều khiển khác bên trong khối
get '/patients/:id', to: 'patients#show', as: 'patient'
91, bạn có thể chỉ định đường dẫn bộ điều khiển tuyệt đối, e. g. @patient = Patient.find[params[:id]]
062. 7 tài nguyên lồng nhau
Thông thường có các tài nguyên là con hợp lý của các tài nguyên khác. Ví dụ: giả sử ứng dụng của bạn bao gồm các mô hình này
get '/patients/:id', to: 'patients#show', as: 'patient'
5Bản saoCác tuyến đường lồng nhau cho phép bạn nắm bắt mối quan hệ này trong quá trình định tuyến của mình. Trong trường hợp này, bạn có thể bao gồm khai báo tuyến đường này
get '/patients/:id', to: 'patients#show', as: 'patient'
6Bản saoNgoài các tuyến đường dành cho tạp chí, khai báo này cũng sẽ định tuyến quảng cáo đến một
@patient = Patient.find[params[:id]]
07. URL quảng cáo yêu cầu tạp chíHTTP VerbPathController#ActionUsed forGET/tạp chí/. magazine_id/adsads#indexhiển thị danh sách tất cả quảng cáo cho một tạp chí cụ thểGET/magazines/. magazine_id/ads/newads#newreturn một biểu mẫu HTML để tạo quảng cáo mới thuộc một tạp chí cụ thểPOST/magazines/. magazine_id/adsads#createtạo quảng cáo mới thuộc về một tạp chí cụ thểGET/magazines/. tạp chí_id/quảng cáo/. idads#showhiển thị một quảng cáo cụ thể thuộc về một tạp chí cụ thểGET/magazines/. tạp chí_id/quảng cáo/. id/editads#editreturn biểu mẫu HTML để chỉnh sửa quảng cáo thuộc một tạp chí cụ thểPATCH/PUT/magazines/. tạp chí_id/quảng cáo/. idads#updateupdate một quảng cáo cụ thể thuộc về một tạp chí cụ thể DELETE/magazines/. tạp chí_id/quảng cáo/. idads#destroyxóa một quảng cáo cụ thể thuộc về một tạp chí cụ thểĐiều này cũng sẽ tạo các trình trợ giúp định tuyến như
@patient = Patient.find[params[:id]]
08 và @patient = Patient.find[params[:id]]
09. Những người trợ giúp này lấy một phiên bản Tạp chí làm tham số đầu tiên [@patient = Patient.find[params[:id]]
10]2. 7. 1 Giới hạn đối với NestingBạn có thể lồng các tài nguyên vào các tài nguyên lồng nhau khác nếu muốn. Ví dụ
get '/patients/:id', to: 'patients#show', as: 'patient'
7Bản saoTài nguyên được lồng sâu nhanh chóng trở nên cồng kềnh. Ví dụ, trong trường hợp này, ứng dụng sẽ nhận ra các đường dẫn như
get '/patients/:id', to: 'patients#show', as: 'patient'
8Bản saoTrình trợ giúp định tuyến tương ứng sẽ là
@patient = Patient.find[params[:id]]
11, yêu cầu bạn chỉ định các đối tượng ở cả ba cấp độ. Thật vậy, tình huống này đủ khó hiểu đến mức một bài báo nổi tiếng của Jamis Buck đề xuất một quy tắc ngón tay cái để thiết kế Rails tốtTài nguyên không bao giờ được lồng sâu hơn 1 cấp
2. 7. 2 Làm Tổ NôngMột cách để tránh lồng sâu [như đã đề xuất ở trên] là tạo các hành động bộ sưu tập nằm trong phạm vi cấp độ gốc, để hiểu được cấu trúc phân cấp, nhưng không lồng các hành động thành viên. Nói cách khác, chỉ xây dựng các tuyến đường với lượng thông tin tối thiểu để xác định duy nhất tài nguyên, như thế này
get '/patients/:id', to: 'patients#show', as: 'patient'
9Bản saoÝ tưởng này tạo ra sự cân bằng giữa các tuyến mô tả và lồng sâu. Có tồn tại cú pháp tốc ký để đạt được điều đó, thông qua tùy chọn
@patient = Patient.find[params[:id]]
12@patient = Patient.find[params[:id]]
0Bản saoĐiều này sẽ tạo ra các tuyến đường chính xác giống như ví dụ đầu tiên. Bạn cũng có thể chỉ định tùy chọn
@patient = Patient.find[params[:id]]
12 trong tài nguyên gốc, trong trường hợp đó, tất cả các tài nguyên lồng nhau sẽ cạn@patient = Patient.find[params[:id]]
1Bản saoTài nguyên bài viết ở đây sẽ có các tuyến sau được tạo cho nó
HTTP VerbPathController#ActionNamed Route HelperGET/articles/. bài viết_id/bình luận[. định dạng]bình luận#indexarticle_comments_pathPOST/articles/. bài viết_id/bình luận[. định dạng]bình luận#createarticle_comments_pathGET/articles/. article_id/bình luận/mới[. định dạng]bình luận#newnew_article_comment_pathGET/bình luận/. id/chỉnh sửa [. định dạng]bình luận#editedit_comment_pathGET/bình luận/. Tôi[. định dạng]bình luận#showcomment_pathPATCH/PUT/bình luận/. Tôi[. định dạng]bình luận#updatecomment_pathDELETE/bình luận/. Tôi[. định dạng]bình luận#destroycomment_pathGET/articles/. bài viết_id/trích dẫn[. định dạng]quotes#indexarticle_quotes_pathPOST/articles/. bài viết_id/trích dẫn[. định dạng]quotes#createarticle_quotes_pathGET/articles/. article_id/quotes/new[. định dạng]quotes#newnew_article_quote_pathGET/quotes/. id/chỉnh sửa [. định dạng]quotes#editedit_quote_pathGET/quotes/. Tôi[. định dạng]quotes#showquote_pathPATCH/PUT/quotes/. Tôi[. định dạng]quotes#updatequote_pathDELETE/quotes/. Tôi[. định dạng]quotes#destroyquote_pathGET/articles/. article_id/bản nháp[. định dạng]bản nháp#indexarticle_drafts_pathPOST/articles/. article_id/bản nháp[. định dạng]bản thảo#createarticle_drafts_pathGET/articles/. article_id/bản nháp/mới[. format]drafts#newnew_article_draft_pathGET/drafts/. id/chỉnh sửa [. format]drafts#editedit_draft_pathGET/drafts/. Tôi[. định dạng]bản nháp#showdraft_pathPATCH/PUT/bản nháp/. Tôi[. format]drafts#updatedraft_pathDELETE/drafts/. Tôi[. định dạng]bản nháp#destroydraft_pathGET/bài viết[. định dạng]articles#indexarticles_pathPOST/articles[. định dạng]articles#createarticles_pathGET/articles/new[. định dạng]bài viết#newnew_article_pathGET/articles/. id/chỉnh sửa [. định dạng]bài viết#editedit_article_pathGET/articles/. Tôi[. định dạng]bài viết#showarticle_pathPATCH/PUT/bài viết/. Tôi[. định dạng]articles#updatearticle_pathDELETE/articles/. Tôi[. định dạng]bài viết#destroyarticle_pathPhương pháp
@patient = Patient.find[params[:id]]
14 của DSL tạo ra một phạm vi bên trong mà mọi lồng đều nông. Điều này tạo ra các tuyến đường giống như ví dụ trước@patient = Patient.find[params[:id]]
2Bản saoCó hai tùy chọn cho
get '/patients/:id', to: 'patients#show', as: 'patient'
98 để tùy chỉnh các tuyến đường cạn. @patient = Patient.find[params[:id]]
16 tiền tố đường dẫn thành viên với tham số được chỉ định@patient = Patient.find[params[:id]]
3Bản saoTài nguyên nhận xét ở đây sẽ có các tuyến sau được tạo cho nó
HTTP VerbPathController#ActionNamed Route HelperGET/articles/. bài viết_id/bình luận[. định dạng]bình luận#indexarticle_comments_pathPOST/articles/. bài viết_id/bình luận[. định dạng]bình luận#createarticle_comments_pathGET/articles/. article_id/bình luận/mới[. định dạng]bình luận#newnew_article_comment_pathGET/sekret/comments/. id/chỉnh sửa [. định dạng]bình luận#editedit_comment_pathGET/sekret/comments/. Tôi[. định dạng]bình luận#showcomment_pathPATCH/PUT/sekret/bình luận/. Tôi[. định dạng]bình luận#updatecomment_pathDELETE/sekret/comments/. Tôi[. định dạng]bình luận#destroycomment_pathTùy chọn
@patient = Patient.find[params[:id]]
17 thêm tham số đã chỉ định vào trình trợ giúp tuyến đường được đặt tên@patient = Patient.find[params[:id]]
4Bản saoTài nguyên nhận xét ở đây sẽ có các tuyến sau được tạo cho nó
HTTP VerbPathController#ActionNamed Route HelperGET/articles/. bài viết_id/bình luận[. định dạng]bình luận#indexarticle_comments_pathPOST/articles/. bài viết_id/bình luận[. định dạng]bình luận#createarticle_comments_pathGET/articles/. article_id/bình luận/mới[. định dạng]bình luận#newnew_article_comment_pathGET/bình luận/. id/chỉnh sửa [. định dạng]bình luận#editedit_sekret_comment_pathGET/bình luận/. Tôi[. định dạng]bình luận#showsekret_comment_pathPATCH/PUT/bình luận/. Tôi[. format]comments#updatesekret_comment_pathDELETE/comments/. Tôi[. định dạng]bình luận#destroysekret_comment_path2. 8 mối quan tâm về định tuyến
Mối quan tâm về định tuyến cho phép bạn khai báo các tuyến phổ biến có thể được sử dụng lại bên trong các tài nguyên và tuyến khác. Để xác định mối quan tâm, hãy sử dụng khối
@patient = Patient.find[params[:id]]
18@patient = Patient.find[params[:id]]
5Bản saoNhững mối quan tâm này có thể được sử dụng trong các tài nguyên để tránh trùng lặp mã và chia sẻ hành vi trên các tuyến
@patient = Patient.find[params[:id]]
6Bản saoỞ trên là tương đương với
@patient = Patient.find[params[:id]]
7Bản saoBạn cũng có thể sử dụng chúng ở bất cứ đâu bằng cách gọi tới số
@patient = Patient.find[params[:id]]
19. Ví dụ: trong khối get '/patients/:id', to: 'patients#show', as: 'patient'
98 hoặc get '/patients/:id', to: 'patients#show', as: 'patient'
91@patient = Patient.find[params[:id]]
8Bản sao2. 9 Tạo đường dẫn và URL từ các đối tượng
Ngoài việc sử dụng trình trợ giúp định tuyến, Rails cũng có thể tạo đường dẫn và URL từ một mảng tham số. Ví dụ: giả sử bạn có tập hợp các tuyến đường này
get '/patients/:id', to: 'patients#show', as: 'patient'
6Bản saoKhi sử dụng
@patient = Patient.find[params[:id]]
22, bạn có thể chuyển các trường hợp của @patient = Patient.find[params[:id]]
23 và @patient = Patient.find[params[:id]]
24 thay vì ID số
0Bản saoBạn cũng có thể sử dụng
@patient = Patient.find[params[:id]]
25 với một tập hợp các đối tượng và Rails sẽ tự động xác định tuyến đường bạn muốn
1Bản saoTrong trường hợp này, Rails sẽ thấy rằng
@patient = Patient.find[params[:id]]
26 là một @patient = Patient.find[params[:id]]
23 và @patient = Patient.find[params[:id]]
28 là một @patient = Patient.find[params[:id]]
24 và do đó sẽ sử dụng trình trợ giúp @patient = Patient.find[params[:id]]
22. Trong những người trợ giúp như @patient = Patient.find[params[:id]]
31, bạn chỉ có thể chỉ định đối tượng thay cho cuộc gọi đầy đủ @patient = Patient.find[params[:id]]
25
2Bản saoNếu bạn chỉ muốn liên kết đến một tạp chí
3Bản saoĐối với các hành động khác, bạn chỉ cần chèn tên hành động làm phần tử đầu tiên của mảng
4Bản saoĐiều này cho phép bạn xử lý các phiên bản mô hình của mình dưới dạng URL và là một lợi thế chính khi sử dụng kiểu tháo vát
2. 10 Thêm nhiều hành động RESTful
Bạn không bị giới hạn trong bảy tuyến mà định tuyến RESTful tạo theo mặc định. Nếu muốn, bạn có thể thêm các tuyến bổ sung áp dụng cho bộ sưu tập hoặc từng thành viên của bộ sưu tập
2. 10. 1 Thêm tuyến thành viênĐể thêm một tuyến đường thành viên, chỉ cần thêm một khối
@patient = Patient.find[params[:id]]
33 vào khối tài nguyên
5Bản saoĐiều này sẽ nhận ra
@patient = Patient.find[params[:id]]
34 bằng GET và định tuyến đến hành động @patient = Patient.find[params[:id]]
35 của get '/patients/:id', to: 'patients#show', as: 'patient'
79, với giá trị id tài nguyên được chuyển vào @patient = Patient.find[params[:id]]
37. Nó cũng sẽ tạo các trình trợ giúp @patient = Patient.find[params[:id]]
38 và @patient = Patient.find[params[:id]]
39Trong khối các tuyến thành viên, mỗi tên tuyến chỉ định động từ HTTP sẽ được nhận dạng. Bạn có thể sử dụng ________ 141, ________ 841, ________ 842, _______ 843 hoặc
@patient = Patient.find[params[:id]]
44 tại đây. Nếu bạn không có nhiều tuyến đường @patient = Patient.find[params[:id]]
33, bạn cũng có thể chuyển @patient = Patient.find[params[:id]]
46 đến một tuyến đường, loại bỏ khối
6Bản saoBạn có thể bỏ tùy chọn
@patient = Patient.find[params[:id]]
46, tùy chọn này sẽ tạo cùng một tuyến thành viên ngoại trừ giá trị id tài nguyên sẽ có sẵn trong @patient = Patient.find[params[:id]]
48 thay vì @patient = Patient.find[params[:id]]
37. Người trợ giúp định tuyến cũng sẽ được đổi tên từ @patient = Patient.find[params[:id]]
38 và @patient = Patient.find[params[:id]]
39 thành @patient = Patient.find[params[:id]]
52 và @patient = Patient.find[params[:id]]
532. 10. 2 Thêm tuyến thu gomĐể thêm tuyến đường vào bộ sưu tập, hãy sử dụng khối
@patient = Patient.find[params[:id]]
54
7Bản saoĐiều này sẽ cho phép Rails nhận ra các đường dẫn như
@patient = Patient.find[params[:id]]
55 với GET và định tuyến tới hành động @patient = Patient.find[params[:id]]
56 của get '/patients/:id', to: 'patients#show', as: 'patient'
79. Nó cũng sẽ tạo các trình trợ giúp định tuyến @patient = Patient.find[params[:id]]
58 và @patient = Patient.find[params[:id]]
59Giống như với các tuyến đường thành viên, bạn có thể chuyển
@patient = Patient.find[params[:id]]
46 đến một tuyến đường
8Bản saoNếu bạn đang xác định các tuyến tài nguyên bổ sung có ký hiệu làm đối số vị trí đầu tiên, hãy lưu ý rằng nó không tương đương với việc sử dụng một chuỗi. Các biểu tượng suy ra các hành động của bộ điều khiển trong khi các chuỗi suy ra các đường dẫn
2. 10. 3 Thêm tuyến đường cho các hành động mới bổ sungĐể thêm một hành động mới thay thế bằng cách sử dụng phím tắt
@patient = Patient.find[params[:id]]
46
9Bản saoĐiều này sẽ cho phép Rails nhận ra các đường dẫn như
@patient = Patient.find[params[:id]]
62 bằng GET và định tuyến đến hành động @patient = Patient.find[params[:id]]
35 của @patient = Patient.find[params[:id]]
64. Nó cũng sẽ tạo các trình trợ giúp tuyến đường @patient = Patient.find[params[:id]]
65 và @patient = Patient.find[params[:id]]
66Nếu bạn thấy mình đang thêm nhiều hành động bổ sung vào một lộ trình tháo vát, thì đã đến lúc dừng lại và tự hỏi liệu bạn có đang ngụy trang cho sự hiện diện của một nguồn lực khác không
Ngoài định tuyến tài nguyên, Rails còn hỗ trợ mạnh mẽ để định tuyến các URL tùy ý tới các hành động. Tại đây, bạn không nhận được các nhóm tuyến đường được tạo tự động bởi định tuyến tháo vát. Thay vào đó, bạn thiết lập từng tuyến đường riêng biệt trong ứng dụng của mình
Mặc dù bạn thường nên sử dụng định tuyến tháo vát nhưng vẫn có nhiều nơi mà định tuyến đơn giản hơn sẽ phù hợp hơn. Không cần phải cố gắng sắp xếp mọi phần cuối cùng của ứng dụng của bạn vào một khuôn khổ tháo vát nếu điều đó không phù hợp
Đặc biệt, định tuyến đơn giản giúp dễ dàng ánh xạ các URL cũ sang các hành động Rails mới
3. 1 tham số ràng buộc
Khi bạn thiết lập một tuyến đường thông thường, bạn cung cấp một loạt ký hiệu mà Rails ánh xạ tới các phần của yêu cầu HTTP sắp tới. Ví dụ, hãy xem xét tuyến đường này
get '/patients/:id', to: 'patients#show', as: 'patient'
20Bản saoNếu một yêu cầu đến của
@patient = Patient.find[params[:id]]
67 được xử lý theo tuyến này [vì nó không khớp với bất kỳ tuyến nào trước đó trong tệp], thì kết quả sẽ là gọi hành động @patient = Patient.find[params[:id]]
68 của get '/patients/:id', to: 'patients#show', as: 'patient'
79 và để cung cấp tham số cuối cùng @patient = Patient.find[params[:id]]
70 dưới dạng @patient = Patient.find[params[:id]]
37. Tuyến này cũng sẽ định tuyến yêu cầu đến của get '/patients/:id', to: 'patients#show', as: 'patient'
46 đến @patient = Patient.find[params[:id]]
73, vì @patient = Patient.find[params[:id]]
74 là tham số tùy chọn, được biểu thị bằng dấu ngoặc đơn3. 2 phân đoạn động
Bạn có thể thiết lập bao nhiêu phân đoạn động trong một tuyến đường thông thường tùy thích. Bất kỳ phân đoạn nào cũng sẽ có sẵn cho hành động như một phần của
get '/patients/:id', to: 'patients#show', as: 'patient'
13. Nếu bạn thiết lập tuyến đường nàyget '/patients/:id', to: 'patients#show', as: 'patient'
21Bản saoMột đường dẫn đến của
@patient = Patient.find[params[:id]]
76 sẽ được gửi đến hành động get '/patients/:id', to: 'patients#show', as: 'patient'
11 của get '/patients/:id', to: 'patients#show', as: 'patient'
79. @patient = Patient.find[params[:id]]
37 sẽ là @patient = Patient.find[params[:id]]
70 và @patient = Patient.find[params[:id]]
81 sẽ là @patient = Patient.find[params[:id]]
82Theo mặc định, phân đoạn động không chấp nhận dấu chấm - điều này là do dấu chấm được sử dụng làm dấu phân cách cho các tuyến đường được định dạng. Nếu bạn cần sử dụng dấu chấm trong phân đoạn động, hãy thêm ràng buộc ghi đè điều này – ví dụ:
@patient = Patient.find[params[:id]]
83 cho phép mọi thứ trừ dấu gạch chéo3. 3 đoạn tĩnh
Bạn có thể chỉ định các phân đoạn tĩnh khi tạo một tuyến đường bằng cách không thêm dấu hai chấm vào một phân đoạn
get '/patients/:id', to: 'patients#show', as: 'patient'
22Bản saoTuyến đường này sẽ phản hồi các đường dẫn như
@patient = Patient.find[params[:id]]
84. Trong trường hợp này, get '/patients/:id', to: 'patients#show', as: 'patient'
13 sẽ là @patient = Patient.find[params[:id]]
863. 4 Chuỗi truy vấn
get '/patients/:id', to: 'patients#show', as: 'patient'
13 cũng sẽ bao gồm bất kỳ tham số nào từ chuỗi truy vấn. Ví dụ, với tuyến đường nàyget '/patients/:id', to: 'patients#show', as: 'patient'
23Bản saoĐường dẫn đến của
@patient = Patient.find[params[:id]]
88 sẽ được gửi đến hành động get '/patients/:id', to: 'patients#show', as: 'patient'
11 của bộ điều khiển get '/patients/:id', to: 'patients#show', as: 'patient'
36. get '/patients/:id', to: 'patients#show', as: 'patient'
13 sẽ là @patient = Patient.find[params[:id]]
863. 5 Xác định giá trị mặc định
Bạn có thể xác định giá trị mặc định trong một tuyến đường bằng cách cung cấp hàm băm cho tùy chọn
@patient = Patient.find[params[:id]]
93. Điều này thậm chí áp dụng cho các thông số mà bạn không chỉ định là phân đoạn động. Ví dụget '/patients/:id', to: 'patients#show', as: 'patient'
24Bản saoRails sẽ khớp
@patient = Patient.find[params[:id]]
94 với hành động get '/patients/:id', to: 'patients#show', as: 'patient'
11 của get '/patients/:id', to: 'patients#show', as: 'patient'
79 và đặt @patient = Patient.find[params[:id]]
97 thành @patient = Patient.find[params[:id]]
98Bạn cũng có thể sử dụng khối
@patient = Patient.find[params[:id]]
99 để xác định giá trị mặc định cho nhiều mụcget '/patients/:id', to: 'patients#show', as: 'patient'
25Bản saoBạn không thể ghi đè giá trị mặc định thông qua các tham số truy vấn - điều này là vì lý do bảo mật. Các giá trị mặc định duy nhất có thể bị ghi đè là các phân đoạn động thông qua thay thế trong đường dẫn URL
3. 6 tuyến đường đặt tên
Bạn có thể chỉ định tên cho bất kỳ tuyến đường nào bằng tùy chọn
00get '/patients/:id', to: 'patients#show', as: 'patient'
26Bản saoĐiều này sẽ tạo ra
01 và
02 như những người trợ giúp định tuyến được đặt tên trong ứng dụng của bạn. Gọi
01 sẽ trả về
04Bạn cũng có thể sử dụng điều này để ghi đè các phương thức định tuyến được xác định bởi tài nguyên bằng cách đặt các tuyến tùy chỉnh trước khi tài nguyên được xác định, như thế này
get '/patients/:id', to: 'patients#show', as: 'patient'
27Bản saoĐiều này sẽ xác định một phương thức
05 sẽ có sẵn trong bộ điều khiển, trình trợ giúp và chế độ xem sẽ đi đến một tuyến đường chẳng hạn như
06. Bên trong hành động get '/patients/:id', to: 'patients#show', as: 'patient'
11 của
08,
09 sẽ chứa tên người dùng cho người dùng. Thay đổi
10 trong định nghĩa tuyến đường nếu bạn không muốn tên tham số của mình là
103. 7 ràng buộc động từ HTTP
Nói chung, bạn nên sử dụng các phương pháp ________ 141, ________ 843, ________ 842, _______ 841 và
@patient = Patient.find[params[:id]]
44 để hạn chế lộ trình đến một động từ cụ thể. Bạn có thể sử dụng phương thức
17 với tùy chọn
18 để ghép nhiều động từ cùng một lúcget '/patients/:id', to: 'patients#show', as: 'patient'
28Bản saoBạn có thể nối tất cả các động từ với một lộ trình cụ thể bằng cách sử dụng
19get '/patients/:id', to: 'patients#show', as: 'patient'
29Bản saoĐịnh tuyến cả yêu cầu
get '/patients/:id', to: 'patients#show', as: 'patient'
27 và get '/patients/:id', to: 'patients#show', as: 'patient'
28 cho một hành động có ý nghĩa bảo mật. Nói chung, bạn nên tránh chuyển tất cả các động từ thành một hành động trừ khi bạn có lý do chính đáng đểget '/patients/:id', to: 'patients#show', as: 'patient'
27 trong Rails sẽ không kiểm tra mã thông báo CSRF. Bạn không bao giờ được ghi vào cơ sở dữ liệu từ yêu cầu get '/patients/:id', to: 'patients#show', as: 'patient'
27, để biết thêm thông tin, hãy xem hướng dẫn bảo mật về các biện pháp đối phó CSRF3. 8 ràng buộc phân đoạn
Bạn có thể sử dụng tùy chọn
24 để thực thi định dạng cho phân đoạn độngget '/patients/:id', to: 'patients#show', as: 'patient'
50Bản saoLộ trình này sẽ khớp với các đường dẫn như
25, nhưng không khớp với
26. Bạn có thể diễn đạt ngắn gọn hơn cùng một lộ trình theo cách nàyget '/patients/:id', to: 'patients#show', as: 'patient'
51Bản sao
24 sử dụng các biểu thức chính quy với hạn chế là không thể sử dụng các ký tự biểu thức chính quy. Ví dụ: tuyến đường sau sẽ không hoạt độngget '/patients/:id', to: 'patients#show', as: 'patient'
52Bản saoTuy nhiên, lưu ý rằng bạn không cần sử dụng neo vì tất cả các tuyến đều được neo ở đầu và cuối
Ví dụ: các route sau sẽ cho phép
get '/patients/:id', to: 'patients#show', as: 'patient'
92 với các giá trị
29 như
30 luôn bắt đầu bằng một số và
31 với các giá trị
29 như
33 không bao giờ bắt đầu bằng một số để chia sẻ không gian tên gốcget '/patients/:id', to: 'patients#show', as: 'patient'
53Bản sao3. 9 ràng buộc dựa trên yêu cầu
Bạn cũng có thể hạn chế một tuyến đường dựa trên bất kỳ phương thức nào trên đối tượng Yêu cầu trả về một
get '/patients/:id', to: 'patients#show', as: 'patient'
64Bạn chỉ định ràng buộc dựa trên yêu cầu giống như cách bạn chỉ định ràng buộc phân đoạn
get '/patients/:id', to: 'patients#show', as: 'patient'
54Bản saoBạn cũng có thể chỉ định các ràng buộc bằng cách sử dụng khối
35get '/patients/:id', to: 'patients#show', as: 'patient'
55Bản saoCác ràng buộc yêu cầu hoạt động bằng cách gọi một phương thức trên đối tượng Yêu cầu có cùng tên với khóa băm và sau đó so sánh giá trị trả về với giá trị băm. Do đó, các giá trị ràng buộc phải khớp với kiểu trả về của phương thức đối tượng Yêu cầu tương ứng. Ví dụ.
36 sẽ khớp với tên miền phụ
37 như mong đợi. Tuy nhiên, sử dụng ký hiệu
38 thì không, vì
39 trả về
40 dưới dạng ChuỗiCó một ngoại lệ cho ràng buộc
41. trong khi đó là một phương thức trên đối tượng Yêu cầu, nó cũng là một tham số tùy chọn ẩn trên mọi đường dẫn. Các ràng buộc phân đoạn được ưu tiên và ràng buộc
41 chỉ được áp dụng như vậy khi được thực thi thông qua hàm băm. Ví dụ:
43 sẽ khớp với
44 vì định dạng là tùy chọn theo mặc định. Tuy nhiên, bạn có thể sử dụng lambda như trong
45 và tuyến đường sẽ chỉ khớp với các yêu cầu JSON rõ ràng3. 10 ràng buộc nâng cao
Nếu bạn có ràng buộc nâng cao hơn, bạn có thể cung cấp một đối tượng đáp ứng
46 mà Rails nên sử dụng. Giả sử bạn muốn định tuyến tất cả người dùng trong danh sách hạn chế tới
47. bạn có thể làmget '/patients/:id', to: 'patients#show', as: 'patient'
56Bản saoBạn cũng có thể chỉ định các ràng buộc dưới dạng lambda
get '/patients/:id', to: 'patients#show', as: 'patient'
57Bản saoCả phương thức
46 và lambda đều lấy đối tượng
49 làm đối số3. 10. 1 Các ràng buộc ở dạng khốiBạn có thể chỉ định các ràng buộc ở dạng khối. Điều này hữu ích khi bạn cần áp dụng cùng một quy tắc cho một số tuyến đường. Ví dụ
get '/patients/:id', to: 'patients#show', as: 'patient'
58Bản saoBạn cũng có thể sử dụng một
50get '/patients/:id', to: 'patients#show', as: 'patient'
59Bản sao3. 11 Route Globling và Wildcard Segments
Toàn cầu hóa tuyến đường là một cách để chỉ định rằng một tham số cụ thể phải được khớp với tất cả các phần còn lại của tuyến đường. Ví dụ
get '/patients/:id', to: 'patients#show', as: 'patient'
60Bản saoLộ trình này sẽ khớp với
@patient = Patient.find[params[:id]]
94 hoặc
52, đặt
53 thành
54 hoặc
55. Các phân đoạn có tiền tố là một ngôi sao được gọi là "phân đoạn ký tự đại diện"Các đoạn ký tự đại diện có thể xảy ra ở bất kỳ đâu trong một tuyến đường. Ví dụ
get '/patients/:id', to: 'patients#show', as: 'patient'
61Bản saosẽ khớp với
56 với ________ 957 bằng với ________ 958 và ________ 959 bằng với ________ 960Về mặt kỹ thuật, một tuyến đường thậm chí có thể có nhiều hơn một đoạn ký tự đại diện. Trình so khớp gán các phân đoạn cho các tham số theo cách trực quan. Ví dụ
get '/patients/:id', to: 'patients#show', as: 'patient'
62Bản saosẽ khớp với
61 với ________ 962 bằng với ________ 963 và ________ 964 bằng với ________ 965Bằng cách yêu cầu
66,
67 của bạn sẽ bằng với
68 với định dạng yêu cầu là JSON. Nếu bạn muốn 3 cái cũ. 0. x trở lại, bạn có thể cung cấp
69 như thế nàyget '/patients/:id', to: 'patients#show', as: 'patient'
63Bản saoNếu bạn muốn bắt buộc phân đoạn định dạng để không thể bỏ qua nó, bạn có thể cung cấp
70 như thế nàyget '/patients/:id', to: 'patients#show', as: 'patient'
64Bản sao3. 12 chuyển hướng
Bạn có thể chuyển hướng bất kỳ đường dẫn nào sang đường dẫn khác bằng cách sử dụng trình trợ giúp
71 trong bộ định tuyến của mìnhget '/patients/:id', to: 'patients#show', as: 'patient'
65Bản saoBạn cũng có thể sử dụng lại các phân đoạn động từ đối sánh trong đường dẫn để chuyển hướng đến
get '/patients/:id', to: 'patients#show', as: 'patient'
66Bản saoBạn cũng có thể cung cấp một khối cho
71, nhận các tham số đường dẫn được ký hiệu và đối tượng yêu cầuget '/patients/:id', to: 'patients#show', as: 'patient'
67Bản saoXin lưu ý rằng chuyển hướng mặc định là chuyển hướng 301 "Đã di chuyển vĩnh viễn". Hãy nhớ rằng một số trình duyệt web hoặc máy chủ proxy sẽ lưu trữ loại chuyển hướng này, khiến trang cũ không thể truy cập được. Bạn có thể sử dụng tùy chọn
73 để thay đổi trạng thái phản hồiget '/patients/:id', to: 'patients#show', as: 'patient'
68Bản saoTrong tất cả các trường hợp này, nếu bạn không cung cấp máy chủ lưu trữ hàng đầu [
74], Rails sẽ lấy những chi tiết đó từ yêu cầu hiện tạiThay vì Chuỗi như
75, tương ứng với hành động get '/patients/:id', to: 'patients#show', as: 'patient'
20 trong @patient = Patient.find[params[:id]]
00, bạn có thể chỉ định bất kỳ ứng dụng Rack nào làm điểm cuối cho bộ so khớpget '/patients/:id', to: 'patients#show', as: 'patient'
69Bản saoMiễn là
78 trả lời
79 và trả về một
80, bộ định tuyến sẽ không biết sự khác biệt giữa ứng dụng Rack và một hành động. Đây là cách sử dụng phù hợp của
19, vì bạn sẽ muốn cho phép ứng dụng Rack của mình xử lý tất cả các động từ khi nó cho là phù hợpĐối với những người tò mò,
75 thực sự mở rộng ra thành
83, trả về một ứng dụng Rack hợp lệVì procs/lambdas là các đối tượng đáp ứng với
79, nên bạn có thể triển khai các tuyến rất đơn giản [e. g. để kiểm tra sức khỏe] trực tuyến. ______985
Nếu bạn chỉ định một ứng dụng Rack làm điểm cuối cho một bộ đối sánh, hãy nhớ rằng tuyến đường sẽ không thay đổi trong ứng dụng nhận. Với lộ trình sau, ứng dụng Rack của bạn sẽ mong đợi lộ trình là
get '/patients/:id', to: 'patients#show', as: 'patient'
96get '/patients/:id', to: 'patients#show', as: 'patient'
10Bản saoThay vào đó, nếu bạn muốn ứng dụng Rack của mình nhận các yêu cầu tại đường dẫn gốc, hãy sử dụng
87get '/patients/:id', to: 'patients#show', as: 'patient'
11Bản sao3. 14 Sử dụng
88
Bạn có thể chỉ định Rails nên định tuyến
89 đến đâu bằng phương thức
88get '/patients/:id', to: 'patients#show', as: 'patient'
12Bản saoBạn nên đặt tuyến đường
88 ở đầu tệp, vì đó là tuyến đường phổ biến nhất và nên được khớp trướcTuyến đường ________ 988 chỉ tuyến đường ________ 127 yêu cầu hành động
Bạn cũng có thể sử dụng gốc bên trong không gian tên và phạm vi. Ví dụ
get '/patients/:id', to: 'patients#show', as: 'patient'
13Bản sao3. 15 tuyến ký tự Unicode
Bạn có thể chỉ định tuyến ký tự unicode trực tiếp. Ví dụ
get '/patients/:id', to: 'patients#show', as: 'patient'
14Bản sao3. 16 tuyến đường trực tiếp
Bạn có thể trực tiếp tạo các trình trợ giúp URL tùy chỉnh bằng cách gọi tới số
94. Ví dụget '/patients/:id', to: 'patients#show', as: 'patient'
15Bản saoGiá trị trả về của khối phải là đối số hợp lệ cho phương thức
@patient = Patient.find[params[:id]]
25. Vì vậy, bạn có thể chuyển một URL chuỗi hợp lệ, Băm, Mảng, một thể hiện Mô hình Hoạt động hoặc một lớp Mô hình Hoạt độngget '/patients/:id', to: 'patients#show', as: 'patient'
16Bản sao3. 17 Sử dụng get '/patients/:id', to: 'patients#show', as: 'patient'
86
get '/patients/:id', to: 'patients#show', as: 'patient'
Phương pháp
get '/patients/:id', to: 'patients#show', as: 'patient'
86 cho phép tùy chỉnh ánh xạ đa hình của các mô hình. Ví dụget '/patients/:id', to: 'patients#show', as: 'patient'
17Bản saoget '/patients/:id', to: 'patients#show', as: 'patient'
18Bản saoĐiều này sẽ tạo ra URL số ít
98 thay vì
99 thông thườngMặc dù các tuyến đường và trình trợ giúp mặc định được tạo bởi
get '/patients/:id', to: 'patients#show', as: 'patient'
19 thường sẽ phục vụ tốt cho bạn, nhưng bạn có thể muốn tùy chỉnh chúng theo một cách nào đó. Rails cho phép bạn tùy chỉnh hầu như bất kỳ phần chung nào của trình trợ giúp tháo vát4. 1 Chỉ định Bộ điều khiển để Sử dụng
Tùy chọn
get '/patients/:id', to: 'patients#show', as: 'patient'
201 cho phép bạn chỉ định rõ ràng bộ điều khiển sẽ sử dụng cho tài nguyên. Ví dụget '/patients/:id', to: 'patients#show', as: 'patient'
19Bản saosẽ nhận ra các đường dẫn đến bắt đầu bằng tuyến xe buýt ________ 146 đến bộ điều khiển ________ 1203
HTTP VerbPathController#ActionNamed Route HelperGET/photosimages#indexphotos_pathGET/photos/newimages#newnew_photo_pathPOST/photosimages#createphotos_pathGET/photos/. idimages#showphoto_path[. id]NHẬN/ảnh/. id/editimages#editedit_photo_path[. id]PATCH/PUT/ảnh/. idimages#updatephoto_path[. id]XÓA/ảnh/. idimages#destroyphoto_path[. Tôi]Sử dụng
get '/patients/:id', to: 'patients#show', as: 'patient'
45, get '/patients/:id', to: 'patients#show', as: 'patient'
47, v.v. để tạo đường dẫn cho tài nguyên nàyĐối với các bộ điều khiển được đặt tên, bạn có thể sử dụng ký hiệu thư mục. Ví dụ
get '/patients/:id', to: 'patients#show', as: 'patient'
20Bản saoĐiều này sẽ định tuyến đến bộ điều khiển
get '/patients/:id', to: 'patients#show', as: 'patient'
206Chỉ ký hiệu thư mục được hỗ trợ. Chỉ định bộ điều khiển với ký hiệu hằng số Ruby [e. g.
get '/patients/:id', to: 'patients#show', as: 'patient'
207] có thể dẫn đến sự cố định tuyến và dẫn đến cảnh báo4. 2 Chỉ định ràng buộc
Bạn có thể sử dụng tùy chọn
24 để chỉ định định dạng bắt buộc trên get '/patients/:id', to: 'patients#show', as: 'patient'
209 ngầm định. Ví dụget '/patients/:id', to: 'patients#show', as: 'patient'
21Bản saoTuyên bố này ràng buộc tham số
@patient = Patient.find[params[:id]]
74 khớp với biểu thức chính quy được cung cấp. Vì vậy, trong trường hợp này, bộ định tuyến sẽ không khớp với @patient = Patient.find[params[:id]]
67 với tuyến đường này nữa. Thay vào đó, get '/patients/:id', to: 'patients#show', as: 'patient'
212 sẽ khớp vớiBạn có thể chỉ định một ràng buộc duy nhất để áp dụng cho một số tuyến đường bằng cách sử dụng biểu mẫu khối
get '/patients/:id', to: 'patients#show', as: 'patient'
22Bản saoTất nhiên, bạn có thể sử dụng các ràng buộc nâng cao hơn có sẵn trong các tuyến không tháo vát trong ngữ cảnh này
Theo mặc định, tham số
@patient = Patient.find[params[:id]]
74 không chấp nhận dấu chấm - điều này là do dấu chấm được sử dụng làm dấu phân cách cho các tuyến đường được định dạng. Nếu bạn cần sử dụng dấu chấm trong @patient = Patient.find[params[:id]]
74, hãy thêm một ràng buộc ghi đè điều này - ví dụ: @patient = Patient.find[params[:id]]
83 cho phép mọi thứ trừ dấu gạch chéo4. 3 Ghi đè Trình trợ giúp định tuyến được đặt tên
Tùy chọn
00 cho phép bạn ghi đè cách đặt tên bình thường cho những người trợ giúp tuyến đường được đặt tên. Ví dụget '/patients/:id', to: 'patients#show', as: 'patient'
23Bản saosẽ nhận ra các đường dẫn đến bắt đầu bằng
get '/patients/:id', to: 'patients#show', as: 'patient'
46 và định tuyến các yêu cầu tới get '/patients/:id', to: 'patients#show', as: 'patient'
79, nhưng sử dụng giá trị của tùy chọn
00 để đặt tên cho người trợ giúpHTTP VerbPathController#ActionNamed Route HelperGET/photosphotos#indeximages_pathGET/photos/newphotos#newnew_image_pathPOST/photosphotos#createimages_pathGET/photos/. idphotos#showimage_path[. id]NHẬN/ảnh/. id/editphotos#editedit_image_path[. id]PATCH/PUT/ảnh/. idphotos#updateimage_path[. id]XÓA/ảnh/. idphotos#destroyimage_path[. Tôi]4. 4 Ghi đè Phân đoạn get '/patients/:id', to: 'patients#show', as: 'patient'
22 và get '/patients/:id', to: 'patients#show', as: 'patient'
23
get '/patients/:id', to: 'patients#show', as: 'patient'
get '/patients/:id', to: 'patients#show', as: 'patient'
Tùy chọn
get '/patients/:id', to: 'patients#show', as: 'patient'
222 cho phép bạn ghi đè các phân đoạn get '/patients/:id', to: 'patients#show', as: 'patient'
22 và get '/patients/:id', to: 'patients#show', as: 'patient'
23 được tạo tự động trong đường dẫnget '/patients/:id', to: 'patients#show', as: 'patient'
24Bản saoĐiều này sẽ khiến việc định tuyến nhận ra các đường dẫn như
get '/patients/:id', to: 'patients#show', as: 'patient'
25Bản saoTên hành động thực tế không bị thay đổi bởi tùy chọn này. Hai đường dẫn được hiển thị sẽ vẫn định tuyến đến các hành động
get '/patients/:id', to: 'patients#show', as: 'patient'
22 và get '/patients/:id', to: 'patients#show', as: 'patient'
23Nếu bạn thấy mình muốn thay đổi tùy chọn này một cách thống nhất cho tất cả các tuyến đường của mình, bạn có thể sử dụng một phạm vi, như bên dưới
get '/patients/:id', to: 'patients#show', as: 'patient'
26Bản sao4. 5 Tiền tố cho Trình trợ giúp định tuyến được đặt tên
Bạn có thể sử dụng tùy chọn
00 để đặt tiền tố cho các trình trợ giúp định tuyến được đặt tên mà Rails tạo cho một tuyến đường. Sử dụng tùy chọn này để ngăn xung đột tên giữa các tuyến sử dụng phạm vi đường dẫn. Ví dụget '/patients/:id', to: 'patients#show', as: 'patient'
27Bản saoĐiều này sẽ cung cấp những người trợ giúp định tuyến như
get '/patients/:id', to: 'patients#show', as: 'patient'
228, get '/patients/:id', to: 'patients#show', as: 'patient'
229, v.v.Để thêm tiền tố vào một nhóm người trợ giúp định tuyến, hãy sử dụng
00 với get '/patients/:id', to: 'patients#show', as: 'patient'
98get '/patients/:id', to: 'patients#show', as: 'patient'
28Bản saoĐiều này sẽ tạo ra các tuyến đường như
get '/patients/:id', to: 'patients#show', as: 'patient'
228 và get '/patients/:id', to: 'patients#show', as: 'patient'
233 ánh xạ tới get '/patients/:id', to: 'patients#show', as: 'patient'
234 và get '/patients/:id', to: 'patients#show', as: 'patient'
235 tương ứngPhạm vi
get '/patients/:id', to: 'patients#show', as: 'patient'
91 sẽ tự động thêm tiền tố
00 cũng như get '/patients/:id', to: 'patients#show', as: 'patient'
238 và get '/patients/:id', to: 'patients#show', as: 'patient'
239Bạn cũng có thể đặt tiền tố cho các tuyến đường có tham số được đặt tên
get '/patients/:id', to: 'patients#show', as: 'patient'
29Bản saoĐiều này sẽ cung cấp cho bạn các URL chẳng hạn như
get '/patients/:id', to: 'patients#show', as: 'patient'
240 và sẽ cho phép bạn tham chiếu phần get '/patients/:id', to: 'patients#show', as: 'patient'
241 của đường dẫn là
09 trong bộ điều khiển, trình trợ giúp và chế độ xem4. 6 Hạn chế các tuyến đã tạo
Theo mặc định, Rails tạo các tuyến cho bảy hành động mặc định [
get '/patients/:id', to: 'patients#show', as: 'patient'
20, get '/patients/:id', to: 'patients#show', as: 'patient'
11, get '/patients/:id', to: 'patients#show', as: 'patient'
22, get '/patients/:id', to: 'patients#show', as: 'patient'
24, get '/patients/:id', to: 'patients#show', as: 'patient'
23, get '/patients/:id', to: 'patients#show', as: 'patient'
25 và get '/patients/:id', to: 'patients#show', as: 'patient'
26] cho mọi tuyến RESTful trong ứng dụng của bạn. Bạn có thể sử dụng các tùy chọn get '/patients/:id', to: 'patients#show', as: 'patient'
250 và get '/patients/:id', to: 'patients#show', as: 'patient'
251 để tinh chỉnh hành vi này. Tùy chọn get '/patients/:id', to: 'patients#show', as: 'patient'
250 yêu cầu Rails chỉ tạo các tuyến được chỉ địnhget '/patients/:id', to: 'patients#show', as: 'patient'
30Bản saoBây giờ, một yêu cầu
get '/patients/:id', to: 'patients#show', as: 'patient'
27 tới get '/patients/:id', to: 'patients#show', as: 'patient'
46 sẽ thành công, nhưng một yêu cầu get '/patients/:id', to: 'patients#show', as: 'patient'
28 tới get '/patients/:id', to: 'patients#show', as: 'patient'
46 [thường được chuyển đến hành động get '/patients/:id', to: 'patients#show', as: 'patient'
24] sẽ không thành côngTùy chọn
get '/patients/:id', to: 'patients#show', as: 'patient'
251 chỉ định một tuyến đường hoặc danh sách các tuyến đường mà Rails không nên tạoget '/patients/:id', to: 'patients#show', as: 'patient'
31Bản saoTrong trường hợp này, Rails sẽ tạo tất cả các route thông thường ngoại trừ route cho
get '/patients/:id', to: 'patients#show', as: 'patient'
26 [một yêu cầu của get '/patients/:id', to: 'patients#show', as: 'patient'
31 gửi tới get '/patients/:id', to: 'patients#show', as: 'patient'
54]Nếu ứng dụng của bạn có nhiều tuyến RESTful, việc sử dụng
get '/patients/:id', to: 'patients#show', as: 'patient'
250 và get '/patients/:id', to: 'patients#show', as: 'patient'
251 để chỉ tạo các tuyến mà bạn thực sự cần có thể cắt giảm việc sử dụng bộ nhớ và tăng tốc quá trình định tuyến4. 7 đường dẫn được dịch
Sử dụng
get '/patients/:id', to: 'patients#show', as: 'patient'
98, chúng tôi có thể thay đổi tên đường dẫn được tạo bởi get '/patients/:id', to: 'patients#show', as: 'patient'
19get '/patients/:id', to: 'patients#show', as: 'patient'
32Bản saoRails hiện tạo các tuyến đến
get '/patients/:id', to: 'patients#show', as: 'patient'
266HTTP VerbPathController#ActionNamed Route HelperGET/kategoriencategories#indexcategories_pathGET/kategorien/neucategories#newnew_category_pathPOST/kategoriencategories#createcategories_pathGET/kategorien/. idcategories#showcategory_path[. id]GET/categorien/. id/bearbeitencategories#editedit_category_path[. id]PATCH/PUT/categorien/. idcategories#updatecategory_path[. id]DELETE/categorien/. idcategories#destroycategory_path[. Tôi]4. 8 Ghi đè dạng số ít
Nếu bạn muốn ghi đè dạng số ít của tài nguyên, bạn nên thêm các quy tắc bổ sung vào bộ lọc thông qua
get '/patients/:id', to: 'patients#show', as: 'patient'
267get '/patients/:id', to: 'patients#show', as: 'patient'
33Bản sao4. 9 Sử dụng
00 trong Nested Resources
Tùy chọn
00 sẽ ghi đè tên được tạo tự động cho tài nguyên trong trình trợ giúp tuyến đường lồng nhau. Ví dụget '/patients/:id', to: 'patients#show', as: 'patient'
34Bản saoĐiều này sẽ tạo ra các trình trợ giúp định tuyến như
get '/patients/:id', to: 'patients#show', as: 'patient'
270 và get '/patients/:id', to: 'patients#show', as: 'patient'
2714. 10 Ghi đè các tham số tuyến đường được đặt tên
Tùy chọn
get '/patients/:id', to: 'patients#show', as: 'patient'
272 ghi đè mã định danh tài nguyên mặc định @patient = Patient.find[params[:id]]
74 [tên của phân đoạn động được sử dụng để tạo tuyến đường]. Bạn có thể truy cập phân đoạn đó từ bộ điều khiển của mình bằng cách sử dụng get '/patients/:id', to: 'patients#show', as: 'patient'
274get '/patients/:id', to: 'patients#show', as: 'patient'
35Bản saoget '/patients/:id', to: 'patients#show', as: 'patient'
36Bản saoget '/patients/:id', to: 'patients#show', as: 'patient'
37Bản saoBạn có thể ghi đè
get '/patients/:id', to: 'patients#show', as: 'patient'
275 của mô hình được liên kết để tạo URLget '/patients/:id', to: 'patients#show', as: 'patient'
38Bản saoget '/patients/:id', to: 'patients#show', as: 'patient'
39Bản saoNếu bạn làm việc trong một ứng dụng lớn với hàng nghìn tuyến đường, một tệp
get '/patients/:id', to: 'patients#show', as: 'patient'
17 đơn lẻ có thể trở nên cồng kềnh và khó đọcRails cung cấp một cách để chia nhỏ một tệp
get '/patients/:id', to: 'patients#show', as: 'patient'
277 khổng lồ thành nhiều tệp nhỏ bằng cách sử dụng macro get '/patients/:id', to: 'patients#show', as: 'patient'
278Bạn có thể có một tuyến đường
get '/patients/:id', to: 'patients#show', as: 'patient'
279 chứa tất cả các tuyến đường cho khu vực quản trị, một tệp get '/patients/:id', to: 'patients#show', as: 'patient'
280 khác cho các tài nguyên liên quan đến API, v.v.get '/patients/:id', to: 'patients#show', as: 'patient'
00Bản saoget '/patients/:id', to: 'patients#show', as: 'patient'
01Bản saoViệc gọi
get '/patients/:id', to: 'patients#show', as: 'patient'
281 bên trong khối get '/patients/:id', to: 'patients#show', as: 'patient'
282 sẽ cố tải tệp tuyến đường có cùng tên với đối số đã cho [get '/patients/:id', to: 'patients#show', as: 'patient'
279 trong ví dụ này]. Tệp cần được đặt bên trong thư mục get '/patients/:id', to: 'patients#show', as: 'patient'
284 hoặc bất kỳ thư mục con nào [i. e. get '/patients/:id', to: 'patients#show', as: 'patient'
285 hoặc get '/patients/:id', to: 'patients#show', as: 'patient'
286]Bạn có thể sử dụng DSL định tuyến thông thường bên trong tệp định tuyến
get '/patients/:id', to: 'patients#show', as: 'patient'
279, nhưng bạn không nên bao quanh nó bằng khối get '/patients/:id', to: 'patients#show', as: 'patient'
282 giống như bạn đã làm trong tệp chính get '/patients/:id', to: 'patients#show', as: 'patient'
175. 1 Không sử dụng tính năng này trừ khi bạn thực sự cần
Có nhiều tệp định tuyến khiến khả năng phát hiện và hiểu khó hơn. Đối với hầu hết các ứng dụng - ngay cả những ứng dụng có vài trăm tuyến - các nhà phát triển sẽ dễ dàng có một tệp định tuyến hơn. Rails định tuyến DSL đã cung cấp một cách để ngắt các tuyến một cách có tổ chức với
get '/patients/:id', to: 'patients#show', as: 'patient'
91 và get '/patients/:id', to: 'patients#show', as: 'patient'
98Rails cung cấp các phương tiện để kiểm tra và thử nghiệm các tuyến đường của bạn
6. 1 Liệt kê các tuyến đường hiện có
Để có danh sách đầy đủ các tuyến có sẵn trong ứng dụng của bạn, hãy truy cập http. //máy chủ cục bộ. 3000/rails/info/routes trong trình duyệt của bạn trong khi máy chủ của bạn đang chạy trong môi trường phát triển. Bạn cũng có thể thực thi lệnh
get '/patients/:id', to: 'patients#show', as: 'patient'
292 trong thiết bị đầu cuối của mình để tạo ra kết quả tương tựCả hai phương pháp sẽ liệt kê tất cả các tuyến đường của bạn, theo cùng thứ tự mà chúng xuất hiện trong
get '/patients/:id', to: 'patients#show', as: 'patient'
17. Đối với mỗi tuyến đường, bạn sẽ thấy- Tên tuyến đường [nếu có]
- Động từ HTTP được sử dụng [nếu tuyến đường không đáp ứng với tất cả các động từ]
- Mẫu URL phù hợp
- Các tham số định tuyến cho tuyến đường
Ví dụ: đây là một phần nhỏ của đầu ra
get '/patients/:id', to: 'patients#show', as: 'patient'
292 cho một tuyến RESTfulget '/patients/:id', to: 'patients#show', as: 'patient'
02Bản saoBạn cũng có thể sử dụng tùy chọn
get '/patients/:id', to: 'patients#show', as: 'patient'
295 để bật chế độ định dạng bảng mở rộngget '/patients/:id', to: 'patients#show', as: 'patient'
03Bản saoBạn có thể tìm kiếm qua các tuyến đường của mình bằng tùy chọn grep. -g. Điều này xuất ra bất kỳ tuyến nào khớp một phần với tên phương thức của trình trợ giúp URL, động từ HTTP hoặc đường dẫn URL
get '/patients/:id', to: 'patients#show', as: 'patient'
04Bản saoNếu bạn chỉ muốn xem các tuyến ánh xạ tới một bộ điều khiển cụ thể, thì có tùy chọn -c
get '/patients/:id', to: 'patients#show', as: 'patient'
05Bản saoBạn sẽ thấy rằng đầu ra từ
get '/patients/:id', to: 'patients#show', as: 'patient'
292 dễ đọc hơn nhiều nếu bạn mở rộng cửa sổ đầu cuối của mình cho đến khi các dòng đầu ra không ngắt dòng6. 2 tuyến đường thử nghiệm
Các tuyến nên được đưa vào chiến lược thử nghiệm của bạn [giống như phần còn lại của ứng dụng của bạn]. Rails cung cấp ba xác nhận tích hợp được thiết kế để làm cho các tuyến thử nghiệm trở nên đơn giản hơn
6. 2. 1 Khẳng địnhget '/patients/:id', to: 'patients#show', as: 'patient'
297get '/patients/:id', to: 'patients#show', as: 'patient'
297 khẳng định rằng một bộ tùy chọn cụ thể tạo ra một đường dẫn cụ thể và có thể được sử dụng với các tuyến mặc định hoặc các tuyến tùy chỉnh. Ví dụget '/patients/:id', to: 'patients#show', as: 'patient'
06Bản sao6. 2. 2 Khẳng định get '/patients/:id', to: 'patients#show', as: 'patient'
299get '/patients/:id', to: 'patients#show', as: 'patient'
299 là nghịch đảo của get '/patients/:id', to: 'patients#show', as: 'patient'
297. Nó khẳng định rằng một đường dẫn nhất định được nhận dạng và định tuyến nó đến một vị trí cụ thể trong ứng dụng của bạn. Ví dụget '/patients/:id', to: 'patients#show', as: 'patient'
07Bản saoBạn có thể cung cấp đối số
get '/patients/:id', to: 'patients#show', as: 'patient'
502 để chỉ định động từ HTTPget '/patients/:id', to: 'patients#show', as: 'patient'
08Bản sao6. 2. 3 Khẳng định get '/patients/:id', to: 'patients#show', as: 'patient'
503Xác nhận
get '/patients/:id', to: 'patients#show', as: 'patient'
503 kiểm tra tuyến đường theo cả hai cách. nó kiểm tra xem đường dẫn có tạo ra các tùy chọn không và các tùy chọn đó có tạo ra đường dẫn không. Do đó, nó kết hợp các chức năng của get '/patients/:id', to: 'patients#show', as: 'patient'
297 và get '/patients/:id', to: 'patients#show', as: 'patient'
299get '/patients/:id', to: 'patients#show', as: 'patient'
09Bản saoNhận xét
Bạn được khuyến khích giúp cải thiện chất lượng của hướng dẫn này
Vui lòng đóng góp nếu bạn thấy bất kỳ lỗi chính tả hoặc lỗi thực tế nào. Để bắt đầu, bạn có thể đọc phần đóng góp tài liệu của chúng tôi
Bạn cũng có thể tìm thấy nội dung không đầy đủ hoặc nội dung không được cập nhật. Vui lòng thêm bất kỳ tài liệu còn thiếu nào cho chính. Đảm bảo kiểm tra Hướng dẫn cạnh trước để xác minh xem sự cố đã được khắc phục hay chưa trên nhánh chính. Kiểm tra Hướng dẫn Hướng dẫn Ruby on Rails để biết phong cách và quy ước
Nếu vì bất kỳ lý do gì mà bạn phát hiện ra điều gì đó cần khắc phục nhưng không thể tự vá nó, vui lòng mở một vấn đề
Và cuối cùng nhưng không kém phần quan trọng, bất kỳ loại thảo luận nào liên quan đến tài liệu Ruby on Rails đều rất được hoan nghênh trên Diễn đàn Ruby on Rails chính thức