2010-02-18 16 views
9

Các tuyến đường trong Ruby on Rails phân biệt chữ hoa chữ thường. Có vẻ như ai đó đã đưa nó lên trước đây, và nó đã được dán nhãn sẽ không sửa chữa.Tuyến đường ray - Cách làm cho trường hợp không nhạy cảm?

http://rails.lighthouseapp.com/projects/8994/tickets/393-routes-are-case-sensitive

Đó đập vào mắt tôi như không may, như tôi không thực sự thấy bất kỳ lộn ngược trên ứng dụng của riêng mình cho các tuyến đường là trường hợp nhạy cảm, trong khi về mặt nhược điểm nó tạo ra một tiềm năng cho sự nhầm lẫn và một diện mạo chung của thiếu đánh bóng trong quan điểm của tôi.

Cách tốt nhất để làm cho các tuyến đường của tôi phân biệt chữ hoa chữ thường là gì?

tôi thấy mẹo này trên tìm kiếm của Google:

map.connect "web_feeds/:action", :controller => 'web_feeds', :action => /[a-z_]+/i 

Đây là thông minh, nhưng nó vẫn để lại phần web_feeds của vụ án url nhạy cảm. Tuy nhiên, tôi không thấy bất kỳ cách tương tự nào xung quanh việc này, mà không cần nhập vào mỗi kết hợp có thể của wEb_feEds theo cách thủ công, nhưng đó rõ ràng là một giải pháp khủng khiếp vì bất kỳ lý do nào.

Trả lời

7

Tôi đã chỉ có cùng một vấn đề, và giải quyết nó bằng cách sử middleware - có một cái nhìn ở đây:

http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/

Lưu ý: Đây chỉ áp dụng cho Rails 2.3+

  • Carsten
+0

Các giải pháp trên không làm việc cho Rails 3, nhưng tôi đã sửa nó ngay bây giờ. –

+0

Cuối cùng tôi đã làm điều này thành một viên ngọc, vì vậy nó dễ sử dụng hơn nhiều: https://rubygems.org/gems/route_downcaser –

+0

Giải pháp này là problmatic nếu bạn có một số tên tài sản/hình ảnh trong Mixed Case. Ví dụ: nếu bạn đã sử dụng hình ảnh từ nội dung/hình ảnh/ABc_xyZZ.png (Hộp hỗn hợp), thì sau khi sử dụng giải pháp này, nó sẽ cố gắng định vị hình ảnh tại nội dung/hình ảnh/abc_xyzz.png (Chữ thường) và máy chủ sẽ phản hồi với 404 không tìm thấy. –

11

Các tuyến đường trong Rails phân biệt chữ hoa chữ thường vì URL phân biệt chữ hoa chữ thường. Từ số điện thoại W3C:

URL nói chung phân biệt chữ hoa chữ thường (ngoại trừ tên máy). Có thể có URL hoặc một phần của URL, trong trường hợp không quan trọng, nhưng xác định các URL này có thể không dễ dàng. Người dùng phải luôn xem xét các URL phân biệt chữ hoa chữ thường.

+0

Thú vị, không biết điều đó. – Davy8

+0

Tôi nghĩ rằng nếu Web đã bắt đầu trên Windows thì nó có thể không bật ra theo cách đó! –

+17

Tôi đánh giá cao thực tế là có những lúc quan trọng để có thể phân biệt trường hợp (mặc dù thẳng thắn những trường hợp duy nhất tôi có thể nghĩ là trường hợp góc), nhưng đối với việc sử dụng thông thường, điều này là trái với mong đợi của người dùng. Người dùng mong đợi stackoverflow.com/questions giống như stackoverflow.com/Questions và thực sự, đây là trường hợp. Và tôi không chắc người dùng thông thường sẽ không lấy lời khuyên của W3C rằng họ nên luôn xem xét rằng các URL có phân biệt chữ hoa chữ thường hay không. –

3

Bạn cũng có thể thử một cách tiếp cận khác. Làm cho trường hợp biến đổi serverside và gửi tất cả mọi thứ để đường ray downcase.

Tôi nghĩ bạn có thể đạt được điều này với mod_rewrite hoặc mod_spelling.

0

Mặc dù URL phân biệt chữ hoa chữ thường, nếu bạn muốn làm cho các tuyến đường của bạn không phân biệt chữ hoa chữ thường, bạn vẫn có thể thực hiện một hành động bẩn.

Trong application_controller.rb đặt:

rescue_from ActionController::RoutingError do |exception| 
redirect_to request.url.downcase 
end 

Nhưng không thực sự làm điều đó. Bạn tạo vòng lặp chuyển hướng cho bất kỳ tuyến đường không tồn tại nào. Bạn thực sự nên phân tích cú pháp request.request_uri thành các thành phần của nó, viết xuống chúng và sử dụng chúng để tạo ra tuyến đường hợp pháp mà bạn chuyển hướng đến. Như tôi đã đề cập ngay, đây là một hack bẩn. Tuy nhiên, tôi nghĩ điều này tốt hơn là làm cho bản đồ lộ trình của bạn xấu xí và bị tấn công.

+3

Bạn nên kiểm tra xem nó đã downcased, một cái gì đó giống như nếu request.url! = Request.url.downcase redirect_to request.url.downcase khác # làm cho 404 tập tin cuối – vise

2

chỉ cần khỉ vá nó xuống dạng chữ thường theo mặc định.ví dụ đơn giản:

module ActionController 
    module Caching 
    module Pages 
     def cache_page(content = nil, options = nil) 
     return unless perform_caching && caching_allowed 

     path = case options 
      when Hash 
      url_for(options.merge(:only_path => true, :skip_relative_url_root => true, :format => params[:format])) 
      when String 
      options 
      else 
      request.path 
     end 

     path = path.downcase 

     self.class.cache_page(content || response.body, path) 
     end 
    end 
    end 
end 
+0

Theo các tiểu bang W3C, URL có phân biệt chữ hoa chữ thường –

2

Một giải pháp đơn giản là, có thể không phải là một cách thanh lịch, nhưng chưa hoàn toàn khả thi là: Sử dụng một before_filter trong điều khiển ứng dụng của bạn như thế này.

before_filter :validate_case 

    def validate_case 
    if request.url != request.url.downcase 
     redirect_301_permanent_to request.url.downcase 
    end 
    end 

    def redirect_301_permanent_to(url) 
    redirect_to url, :status=>:moved_permanently 
    end 

Như tôi đã nói rằng nó không phải là một phiếu bầu thanh lịch nhưng vẫn hoạt động được, do đó bạn không nên bỏ phiếu. : P

+0

Tốt hơn là nên làm điều đó trong Rack. Trong bộ điều khiển ứng dụng bạn đã vượt qua bởi điều phối tuyến đường của Rails. –

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