yönlendirme
Yönlendirme nedir
Sinatra’da yönlendirme, uygulamanızın istek yolu (ör. “/welcome”) ve kullanılan “HTTP” fiili (ör. “GET” veya “POST”) ile isteklere nasıl yanıt verdiğidir. Bir talebin yazılma şekli aşağıdaki gibidir:
<http-verb> <path> do
<code block to execute when this route is requested>
end
“Merhaba, naber” yazan bir sayfa döndürerek “/hello” yoluna “GET” isteklerine yanıt veren bir örnek:
get "/hello" do
return "Hi, whats up"
end
Sinatra yalnızca sizin tanımladığınız rotalara yanıt verir. Bir rota tanımlamazsanız, Sinatra bir “404 Sayfa Bulunamadı” hata sayfası döndürür.
Sinatra, rotalara tanımlandıkları sırayla yanıt verir. Belirli bir istekle eşleşebilecek birkaç rotanız varsa (“Regexp tabanlı yol eşleştirme” konusuna bakın), isteğe uyan ilk rota döndürülür.
NOT: Sinatra, sonunda eğik çizgi (/
) olan ve olmayan rotaları 2 farklı ve farklı rota olarak ele alır. Yani, get '/hello'
ve get '/hello/'
varsayılan olarak farklı kod bloklarıyla eşleşir. Sondaki eğik çizgiyi yok saymak ve her iki rotaya da aynı şekilde davranmak istiyorsanız, eğik çizgiden sonra ‘?’ ekleyerek onu isteğe bağlı hale getirebilirsiniz, örneğin: ‘/hello/?’’. Bu, Sinatra’nın rota eşleştirme için normal ifadeleri kullanma yeteneğini kullanır (daha fazlası aşağıdadır).
Mevcut Sinatra Yönlendirme fiilleri
Sinatra’da bir dizi mevcut yönlendirme fiili vardır, bunlar doğrudan http fiillerine karşılık gelir.
get '/' do
.. get some data, a view, json, etc ..
end
post '/' do
.. create a resource ..
end
put '/' do
.. replace a resource ..
end
patch '/' do
.. change a resource ..
end
delete '/' do
.. delete something ..
end
options '/' do
.. appease something ..
end
link '/' do
.. affiliate something ..
end
unlink '/' do
.. separate something ..
end
Normal ifade tabanlı yol eşleştirme
Bir rotanın yolunu eşleştirirken, bunu yalnızca bir yolla eşleştirerek açıkça yapabilirsiniz, şöyle:
get "/hello" do
return "Hello!"
end
Karmaşık rotaları eşleştirmek için normal bir ifade de kullanabilirsiniz. Normal ifadeyle eşleşen herhangi bir rota, bu kod bloğunu çalıştıracaktır. Birden çok rota potansiyel olarak istekle eşleşebiliyorsa, ilk eşleşen rota yürütülür.
“/user/” ve ardından bir veya daha fazla rakam (muhtemelen kullanıcı kimlikleri) içeren yollarla, yani “GET /user/1” ile eşleşen tipik bir rota örneği:
get /\/user\/\d+/ do
"Hello, user!"
end
Yukarıdaki örnek /user/1
ile eşleşir, ancak /delete/user/1
ve /user/1/delete/now
ile de eşleşir, çünkü normal ifademiz çok kısıtlayıcı değildir ve karşı kısmi eşleşmeye izin verir. yolun herhangi bir parçası.
Normal ifadeyle daha açık olabiliriz ve eşleşmeyi yolun başına ve sonuna bağlamak için ‘\A’ ve ‘\z’ yönergelerini kullanarak rotayla tam olarak eşleşmesini söyleyebiliriz:
get /\A\/user\/\d+\z/ do
"Hello, user!"
end
Bu rota, eşleşme bağlantısı nedeniyle /delete/user/1
veya /user/1/delete/now
ile eşleşmeyecek.
Sondaki /
Yok sayılıyor
Yukarıdaki örnek rotamız ayrıca /user/1/
ile eşleşmeyecektir (sondaki eğik çizgi ile). Rotanın sonundaki eğik çizgiyi yok saymak istiyorsanız, eğik çizgiyi isteğe bağlı yapmak için normal ifadeyi ayarlayın (sondaki \/?
işaretine dikkat edin):
get /\A\/user\/\d+\/?\z/ do
"Hello, user! You may have navigated to /user/<ID> or /user/<ID>/ to get here."
end
Rota Eşleşmelerini Yakalama
Şimdiye kadar, normal ifade yollarıyla eşleştirdik, ancak ya eşleşen değerleri kod bloğumuzda kullanmak istersek? Örneğimizi takip ederek, rota yürütüldüğünde kullanıcının kimliğinin ne olduğunu nasıl bilebiliriz?
Yolun istenen kısmını yakalayabilir ve rota içindeki verilerle çalışmak için Sinatra’nın ‘param[:captures]’ değişkenini kullanabiliriz:
get /\A\/user\/(\d+)\/?\z/ do
"Hello, user! Your ID is #{params['captures'].first}!"
end
Sinatra Rota Parametreleri
Tabii ki Sinatra rotalarına veri iletebilir, rotalarınızda veri kabul etmek için rota parametreleri ekleyebilirsiniz. Daha sonra bir params karmasına erişebilirsiniz:
get '/hello/:name' do
# matches "GET /hello/foo" and "GET /hello/bar"
# params['name'] is 'foo' or 'bar'
"Hello #{params['name']}!"
end
Ayrıca, genellikle Ruby karmalarında yaptığımız gibi, parametreleri doğrudan değişkenlere atayabilirsiniz:
get '/hello/:name' do |n|
# matches "GET /hello/foo" and "GET /hello/bar"
# params['name'] is 'foo' or 'bar'
# n stores params['name']
"Hello #{n}!"
end
Yıldızları kullanarak herhangi bir özel ad olmadan joker karakter parametreleri de ekleyebilirsiniz. Daha sonra params[‘splat’] kullanılarak erişilebilirler:
get '/say/*/to/*' do
# matches /say/hello/to/world
params['splat'] # => ["hello", "world"]
end