2011-10-09 3 views
24

Tôi có ứng dụng Ruby Sinatra và tôi có một số mã mà tôi cần thực thi trên tất cả các tuyến ngoại trừ một vài ngoại lệ. Làm thế nào để tôi làm điều này?ở Sinatra làm thế nào để bạn tạo bộ lọc "trước" phù hợp với tất cả các tuyến trừ một số

Nếu tôi muốn thực thi mã trên các tuyến đường được lựa chọn (kiểu danh sách trắng) Tôi muốn làm điều này:

['/join', "/join/*", "/payment/*"].each do |path| 
    before path do 
     #some code 
    end 
end 

Làm thế nào để làm điều đó theo chiều ngược lại mặc dù (phong cách danh sách đen)? Tôi muốn để phù hợp với tất cả các tuyến ngoại trừ '/join', '/join/*''/payment/*'

Trả lời

32

Với tiêu cực nhìn về phía trước:

before /^(?!\/(join|payment))/ do 
    # ... 
end 

Với pass:

before do 
    pass if %w[join payment].include? request.path_info.split('/')[1] 
    # ... 
end 

Hoặc bạn có thể tạo ra một custom matcher.

+0

Tôi có thể bao gồm đường dẫn gốc ('/') trong câu lệnh chuyển này như thế nào? –

+1

vượt qua nếu ['join', 'payment', nil] .include? request.path_info.split ('/') [1] –

1

Bạn có thể sử dụng Regular Expressions cho định tuyến trong Sinatra

ví dụ:

get %r{/hello/([\w]+)} do |c| 
    "Hello, #{c}!" 
end 

lấy từ here. ở đó bạn có thể tìm thêm thông tin.

để xây dựng và kiểm tra regex của bạn, bạn có thể sử dụng http://rubular.com/

+0

Xem, đó là đã rõ ràng từ việc đọc các tài liệu. Những gì không rõ ràng từ các tài liệu (Sinatra: README) là có hay không * trước khi bộ lọc * cũng có thể lấy các mẫu regex. Bạn sẽ nhận thấy cách * trước và sau khi bộ lọc * nằm trong một phần hoàn toàn khác của bài viết mà bạn đã liên kết. Vì vậy, câu trả lời của bạn thêm không có giá trị (ngoại trừ có lẽ là liên kết cuối cùng) và chỉ lặp lại những gì các tài liệu đã được nhà nước. Vì vậy, downvote của tôi. – 0xC0000022L

2

Những gì tôi đã làm để tạo bộ lọc "trước khi tất cả, ngoại trừ ..." là sử dụng một ký hiệu và sau đó chạy mã trên điều kiện ký hiệu.

before '/*' do 
    unless params[:splat] == 'nofilter' || params[:splat] == 'beta' 
    redirect '/beta' 
    end 
end 

Điều này cho phép tôi để tạo ra một bộ lọc trước với một chuyển hướng mà không tạo ra một vòng lặp chuyển hướng

+0

không phải là: tách một mảng? – 0xSina