Bazı

2011-10-09 23 views
24

dışında tüm rotalarla eşleşen bir "önce" filtresi nasıl yaparım Bir Ruby Sinatra uygulamasına sahibim ve birkaç istisna dışında tüm rotalarda yürütmem gereken bir kod var. Bunu nasıl yaparım? Seçtiğim yolları üzerinde kod çalıştırmak istiyorsaBazı

(beyaz liste tarzı) ben bu yapardım:

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

Nasıl olsa (kara liste tarzı) da başka biçimde yapıyorlar? Ben Örneğin sinatra

yönlendirme yapma Normal İfadesi kullanabilirsiniz '/join', '/join/*' ve '/payment/*'

cevap

32

kullanabilirsiniz için:

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

pass olarak:

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

Yoksa custom matcher yaratabilir.

+0

Bu geçiş ifadesinde kök yolunu ('/') nasıl ekleyebilirim? ['Join', 'payment', nil] .include ise –

+1

geçmek? request.path_info.split ('/') [1] –

1

hariç tüm yolları eşleştirmek istiyorum:

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

here alınan. Orada daha fazla bilgi bulabilirsiniz.

kurmak ve regex negatif görünüm yeşil ışık ile http://rubular.com/

+0

See yaratmadı bir yönlendirme ile filtrenin önce yapmak için izin, zaten dokümanlar okumasını açık. Belgelerden (Sinatra: README) açıkça anlaşılamayanlar, * filtrelerden önce * normal ifadeler alabilir. Filtrelerin * önce ve sonra nasıl * bağlandığınız makalenin tamamen farklı bir bölümünde olduğunu göreceksiniz. Bu yüzden cevabınız hiçbir değer eklemiyor (belki de son bağlantı hariç) ve sadece belgelerin zaten belirttiği şeyi tekrarlıyor. Böylece benim downvote. – 0xC0000022L

2

"Her şeyden önce, dışında ..." filtresi yapmak için yaptığım bir süzgeç kullanıldı ve ardından kod koşullan koşullarında kod çalıştırılıyor.

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

Bu beni yönlendirme döngüsü

+0

değil: bir dizi uyarısı? – 0xSina