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