2012-10-16 40 views
6

Các url là (vì một lý do không rõ ràng, tạo ra các vấn đề khác nhau/không có lợi thế thực) được xác định trường hợp nhạy cảm bởi w3.Rails routes.rb - Trường hợp trùng khớp không nhạy cảm

Khả năng của tôi trong route.rb khớp với phân biệt chữ hoa chữ thường là gì?

đây các khớp:

match '/:foo/library/:bar' => 'library#show' 

Url Ví dụ:/europe/thư viện/page4711

cuộc gọi hiển thị hành động trong bộ điều khiển thư viện với {: foo => "europe",: thanh => "page4711 "}

những gì tôi muốn là 2 điều:

  • p giá trị aram của: foo cần a .giống như vậy/Châu Âu phải là { : foo => "europe"}
  • thư viện phải khớp với chữ hoa chữ thường (ví dụ:/Thư viện,/THƯ VIỆN, /liBRarY tất cả phải khớp)

Làm cách nào để thực hiện điều này trong routes.rb?

Cảm ơn!

+0

Có thể có liên quan: http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/ –

+0

@shioyama: Cuối cùng tôi đã thực hiện điều này làm đá quý: https: // rubygems.org/gems/route_downcaser –

Trả lời

7

Ok, để trả lời câu hỏi của riêng tôi:

Không có cách nào tốt để thực hiện điều này trong Rails routes.rb.

Dưới đây là những gì tôi đã làm:

Đối với điều đầu tiên tôi tạo ra một before_filter trong bộ điều khiển của tôi:

before_filter :foo_to_lower_case 

def foo_to_lower_case 
    params[:foo] = params[:foo].downcase 
end 

Đối với một thứ hai tôi đã tạo ra một quy tắc cân bằng tải để làm cho nó thành chữ thường để ứng dụng đường ray . Tất nhiên bạn cũng có thể định nghĩa quy tắc nginx/apache.

Chỉnh sửa: Tôi đã tìm thấy giải pháp khác cho phần thứ hai vì tôi không thích phân tích cú pháp trước/thay thế từng url.

Tôi đã tạo "thư viện" thành một biểu tượng và đã viết một ràng buộc cho nó chỉ chấp nhận bất kỳ hình thức nào của từ "thư viện".

Vì vậy, các dòng trong routes.rb trông giống như:

match '/:foo/:library/:bar' => 'library#show', :constraints => { :library => /library/i } 
+0

tối ưu hóa: 'params [: foo] .downcase! ' – brauliobo

2

Để downcase đường dẫn, bạn có thể thiết lập một initializer để thêm một middleware rack. Ở đây tôi đang kiểm tra xem đường dẫn có bắt đầu bằng /postsposts không phải là một phần của từ dài hơn hay không. Xem các bình luận mã để biết thêm thông tin.

class PathModifier 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    if env['PATH_INFO'] =~ /^\/posts\b/i 
     Rails.logger.debug("modifying path") 
     %w(PATH_INFO REQUEST_URI REQUEST_PATH ORIGINAL_FULLPATH).each do |header_name| 
     # This naively downcases the entire String. You may want to split it and downcase 
     # selectively. REQUEST_URI has the full url, so be careful with modifying it. 
     env[header_name].downcase! 
     end 
    end 
    @app.call(env) 
    end 
end 
Rails.configuration.middleware.insert(0, PathModifier) 
3

Chỉ cần thêm video này vào Gemfile bạn

gem 'route_downcaser' 

ray khởi động lại, không cần cấu hình cần thiết. các github cho dự án này là tại địa chỉ:

https://github.com/carstengehling/route_downcaser

Như đã đề cập trong gem "chuỗi truy vấn các thông số và các đường dẫn tài sản không thay đổi trong bất kỳ cách nào."

+0

đẹp, nhưng sẽ rất thú vị khi cụ thể hơn – brauliobo

+1

Cẩn thận, đá quý này quá dễ sử dụng. – Shadoath

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