Ruby on Rails 2.1 - Hệ thống định tuyến

Rails phân tích cú pháp URL để xác định bộ điều khiển, hành động và các tham số cho yêu cầu. Với định tuyến Rails, các phần của URL có thể chỉ định các tham số bổ sung và toàn bộ quá trình định tuyến nằm trong tầm kiểm soát của bạn. Các quy tắc định tuyến hoạt động giống nhau trên bất kỳ máy chủ web nào.

Tệp config / route.rb là trung tâm của hệ thống định tuyến Rails. Tệp này chứa các quy tắc cố gắng khớp với đường dẫn URL của một yêu cầu và xác định vị trí dẫn yêu cầu đó. Các quy tắc được kiểm tra theo thứ tự chúng được xác định trong tệp. Quy tắc đầu tiên để khớp với đường dẫn URL của yêu cầu xác định số phận của yêu cầu đó.

Hệ thống định tuyến thực sự thực hiện hai điều:

  • Nó ánh xạ các yêu cầu tới các phương thức hành động bên trong bộ điều khiển.

  • Nó ghi URL cho bạn để sử dụng làm đối số cho các phương thức như link_to, redirect_to và form_tag.

Do đó, hệ thống định tuyến biết cách biến URL yêu cầu của khách truy cập thành một trình điều khiển / chuỗi hành động. Nó cũng biết cách tạo chuỗi URL dựa trên thông số kỹ thuật của bạn.

Hãy xem xét lộ trình sau do Rails cài đặt khi bạn tạo ứng dụng của mình -

map.connect ':controller/:action/:id'

Tuyến đường này nói rằng nó yêu cầu các yêu cầu bao gồm :controller tiếp theo là một :action đến lượt nó được cho ăn một số :id.

Nếu bạn nhận được một yêu cầu đến cho "http: // localhost: 3000 / book / edit / 2", thì nó sẽ ánh xạ như sau:

params = {  :controller => 'book',
   :action     => 'edit',
   :id         => '2'
}

Do đó, định tuyến mặc định (nếu bạn không sửa đổi các quy tắc định tuyến) là:

http://<base-url>/<controller>/<action>/<id>

Một URL như http://www.example.com/book/update/20 gọi update phương thức (hành động) trong BooksController lớp (bộ điều khiển) với một id tham số được đặt thành giá trị 20.

Khối mã sau sẽ thiết lập sách làm bộ điều khiển mặc định nếu không có cái nào khác được chỉ định. Nó có nghĩa là truy cập '/' sẽ gọibook bộ điều khiển.

ActionController::Routing:Routes.draw do |map|
   map.connect ':controller/:action/:id',:controller => 'book'
end

Bạn cũng có thể xác định một hành động mặc định nếu không có hành động nào được chỉ định trong URL đã cho -

ActionController::Routing:Routes.draw do |map|
   map.connect ':controller/:action/:id', 
   :action => 'edit',:controller => 'book'
end

Bây giờ, bạn có thể chỉnh sửa tất cả các phương pháp bên trong trình điều khiển sách để chỉnh sửa sách với ID 20 như sau:

http://localhost:3000/2

Mức độ ưu tiên của tuyến đường

Các tuyến có mức độ ưu tiên được xác định theo thứ tự xuất hiện của các tuyến trong tệp route.rb. Ưu tiên đi từ trên xuống dưới.

Tuyến cuối cùng trong tệp đó có mức ưu tiên thấp nhất và sẽ được áp dụng cuối cùng. Nếu không có tuyến nào phù hợp, 404 được trả về.

Sửa đổi tuyến đường mặc định

Bạn có thể thay đổi tuyến đường mặc định theo yêu cầu của bạn. Trong ví dụ sau, chúng ta sẽ trao đổi bộ điều khiểnhành động như sau:

# Install the default route as the lowest priority.
map.connect ':action/:controller/:id'

Bây giờ, để gọi hành động từ bộ điều khiển đã cho , bạn sẽ phải viết URL của mình như sau:

http://localhost:3000/action/controller/id

Thật không hợp lý khi đặt hành độngbộ điều khiển theo trình tự như vậy. Tuyến mặc định ban đầu (default default) tốt hơn và được khuyến nghị.

Tuyến Ante-Mặc định

Tuyến 'ante-default' trông như sau:

map.connect ':controller/:action/:id.:format'

Định dạng.: Ở cuối khớp với một dấu chấm chữ và giá trị "định dạng" ký tự đại diện sau trường id. Điều đó có nghĩa là nó sẽ khớp, ví dụ, một URL như thế này -

http://localhost:3000/book/show/3.xml

Ở đây, bên trong hành động của bộ điều khiển, params[:format] sẽ được đặt thành xml.

Con đường trống

Tuyến đường trống là loại ngược lại với tuyến đường mặc định. Trong một tệp route.rb mới được tạo, tuyến đường trống được nhận xét vì không có mặc định chung hoặc hợp lý cho nó. Bạn cần quyết định xem URL này không nên làm gì cho mỗi ứng dụng bạn viết.

Dưới đây là một số ví dụ về các quy tắc định tuyến trống khá phổ biến -

map.connect '', :controller => "main", :action => "welcome"
map.connect '', :controller => "main"

Đây là giải thích của các quy tắc trên -

  • Cái đầu tiên sẽ tìm kiếm hành động chào mừng bên trong bộ điều khiển chính ngay cả khi bạn chỉ nhập http: // localhost: 3000.

  • Cái cuối cùng đó sẽ kết nối với http: // localhost: 3000 / main / index. Đây chỉ mục là hành động mặc định khi không có chỉ định nào.

Rails 2.0 giới thiệu một phương thức ánh xạ có tên root trở thành cách thích hợp để xác định tuyến đường trống cho ứng dụng Rails, như thế này:

map.root :controller => "homepage"

Việc xác định tuyến đường trống giúp mọi người xem xét khi họ kết nối với trang web của bạn mà không có gì khác ngoài tên miền.

Các tuyến đường được đặt tên

Khi bạn tiếp tục phát triển ứng dụng của mình, bạn có thể sẽ có một vài liên kết mà bạn sử dụng trong suốt ứng dụng của mình. Ví dụ, bạn có thể sẽ thường đặt một liên kết trở lại trang danh sách chính. Thay vì phải thêm dòng sau trong toàn bộ ứng dụng của mình, thay vào đó bạn có thể tạo một tuyến được đặt tên cho phép bạn liên kết đến phiên bản viết tắt của liên kết đó -

link_to 'Home', :controller => 'classified', :action => 'list'

Bạn có thể xác định các tuyến đường được đặt tên như sau. Ở đây thay vì sử dụng kết nối , bạn đang sử dụng một tên duy nhất mà bạn có thể xác định. Trong trường hợp này, tuyến đường được gọi là nhà . Phần còn lại của tuyến trông giống với những tuyến khác mà bạn đã tạo.

map.home '', :controller => 'classified', :action => 'list'

Bây giờ, bạn có thể sử dụng điều này trong bộ điều khiển hoặc dạng xem như sau:

<%= link_to 'Back', home_url %>

Ở đây, thay vì liệt kê hành động : controller: mà bạn sẽ liên kết, thay vào đó bạn đặt tên của tuyến đường theo sau là _url. Người dùng của bạn sẽ không nhận thấy bất kỳ sự khác biệt nào. Định tuyến được đặt tên chỉ là một sự thuận tiện cho nhà phát triển Rails để tiết kiệm một số thao tác nhập. Trường hợp trên có thể được viết mà không có tuyến đường được đặt tên như sau:

<%= link_to 'Back', {:action => 'list'} %>

URL đẹp

Các tuyến có thể tạo ra các URL đẹp. Ví dụ -

map.connect 'articles/:year/:month/:day',
   :controller => 'articles',
   :action     => 'find_by_date',
   :year       => /\d{4}/,
   :month      => /\d{1,2}/,
   :day        => /\d{1,2}/

# Using the route above, the url below maps to:
# params = {:year => '2005', :month => '11', :day => '06'}
# http://localhost:3000/articles/2005/11/06

Để biết thêm chi tiết về Lộ trình, vui lòng xem qua ActionController::Routing.