Tôi đang cố gắng viết một tuyến bắt tất cả trong Rails 3, nhưng tôi muốn đặt trước một số thuật ngữ trong đó. Tôi đặc biệt sau đây ví dụ đưa ra trong bài viết này, trong câu trả lời của David Burrows: Dynamic routes with Rails 3Rails 3: tạo một con đường dễ hiểu để đọc và sửa đổi
Cú pháp Tôi đang sử dụng như sau:
match '*path' => 'router#routing', :constraints => lambda{|req| (req.env["REQUEST_PATH"] =~ /(users|my-stuff)/).nil? }
Bây giờ, cú pháp mà làm việc tốt - nếu người dùng truy cập một trang có "người dùng" hoặc "nội dung của tôi" trong đường dẫn, nó rơi qua toàn bộ nội dung và chuyển đến một địa điểm cụ thể. Nếu người dùng truy cập vào bất kỳ URL nào khác, nó sẽ chuyển đến logic định tuyến của tôi.
Câu hỏi của tôi là nhiều hơn về khả năng đọc - có cách nào tôi có thể đối sánh tuyến đường với một số nội dung khác khác so với regex không? Có cách nào để cung cấp một loạt các thuật ngữ để phù hợp với không? Ngoài ra, có cách nào để phù hợp với các phân đoạn cụ thể của tuyến đường, trái với toàn bộ điều đó không?
Rõ ràng Rails có định tuyến dựng sẵn, nhưng dự án này có yêu cầu đối với một số tuyến đường, bộ điều khiển không có trong URL. Do đó, bắt tất cả.
Nhờ sự giúp đỡ
Dưới đây là các tập tin tuyến đường được cập nhật mỗi câu trả lời dưới đây:
class RouteConstraint
RESERVED_ROUTES = ['users', 'my-stuff']
def matches?(request)
!RESERVED_ROUTES.map {|r| request.path.include?(r)}.empty?
end
end
App::Application.routes.draw do
resources :categories
resources :sites
match '*path' => 'router#routing', :constraints => RouteConstraint.new
devise_for :users, :path_names =>{ :sign_in => 'login', :sign_out => 'logout', :registration => 'register' }
root :to => "router#routing"
end
Điều này được đóng, nhưng bây giờ thay vì bỏ qua "tuyến đường ẩn" được liệt kê, logic cố gắng cấp chúng cho bộ điều khiển định tuyến. Nếu tôi loại bỏ các bang hoặc .empty? gọi trong phương thức khớp, logic hoạt động cho các từ dành riêng, nhưng không phải cho mọi thứ khác. Xin lỗi, sự hiểu biết của tôi về lambdas là khá hạn chế. –
Ah, tôi hiểu lầm câu hỏi của bạn sau đó, logic của tôi là đối diện chính xác của bạn. Bạn có thể đăng thêm một chút các tệp tuyến đường của mình không, để xem cách tất cả các nội dung phù hợp có ở đó không? –
Ok, tôi đã thêm các tuyến đường hiện tại vào câu hỏi của mình ở trên. –