Sinatra ile echo uygulaması yapalım

Andaç Karay Kudu, 07 Dec 2015

Bir önceki yazımda sinatradan bahsetmiştim. Sinatra’nın sitesindeki örnekten yola çıkarak bir hello world web uygulaması hazırlamıştık.

Sırada echo uygulaması var. Yani web uygulamasının sayfadaki formu kullanarak gönderdiğimiz mesajı bize göstermesini istiyoruz.

Öncelikle bir forma ihtiyacımız var. Sade bir form işimizi görecektir.

<form method="POST">
  <input type="text" name="message">
</form>

Formu HTML dili ile hazırladığımıza göre HTML dilinin kurallarına uymaya da özen gösterelim.

<!DOCTYPE html>
<html>
  <head>
    <title>echo</title>
  </head>
  <body>
    <form method="POST">
      <input type="text" name="message">
    </form>
  </body>
</html>

Tabi ki gönderdiğimiz mesajı da görmek istiyoruz.

HTML kodu içerisinde ruby kodu çalıştırmak için erb (embedded / gömülü ruby) etiketlerine (tag) ihtiyacımız var. HTML içerisinde <% ve %> etiketleri arasına yazdığımız her şey ruby dili ile yorumlanır. Eğer kodun çıktısını görmek istiyorsak <% yerine <%= kullanmamız yeterli olacaktır.

<!DOCTYPE html>
<html>
  <head>
    <title>echo</title>
  </head>
  <body>
    <form method="POST">
      <input type="text" name="message">
    </form>
    <p><%= @message %></p>
  </body>
</html>

Sinatra, tilt kütüphanesi sayesinde pek çok şablon dilini destekliyor. Tilt, Sinatranın gem pakedinin bağımlılıkları içerisinde olduğundan sinatra ile birlikte kuruluyor. Bu nedenle ek bir işlem yapmamıza gerek yok.

Biz erb kullanmaya karar verdiğimiz için erb desteğini programımıza dahil edeceğiz.

Artık programımızın koduna geçebiliriz.

# echo.rb
require 'sinatra'
require 'tilt/erb'

get '/' do
  erb :index
end

post '/' do
  @message = params[:message]
  erb :index
end

Formumuzda methodu POST olarak belirlediğimiz için gelen POST isteğini karşılamak için bir post metoduna ihtiyacımız var (HTTP ve istek metodları hakkında bilgi edinmek için wikipediadaki ilgili başlığa bir göz atabilirsiniz).

Sinatra, web isteklerinden gelen değerlere erişebilmemiz için params adında bir değişene sahip. Bu değerlere params değişkeni içerisinden adları ile ulaşabiliyoruz.

Dikkat ederseniz form içerisindeki giriş (input) alanımızın adı “message” ve bu alana yazdığımız değere de params[:message] ile erişiyoruz. Bu mesajı şablon içerisine gömdüğümüz ruby koduna aktarabilmek için @message adındaki bir değişkene atıyoruz.

İstersek HTML şablonumuzu “views” dizini içerisine “index.erb” adıyla kaydedip kullanabiliriz. Bu defa (uygulamayı basit tutmak adına) ayrı bir şablon dosyası kullanmak yerine, şablonu program kodunun sonuna ekleyeceğiz.

# echo.rb
require 'sinatra'
require 'tilt/erb'

get '/' do
  erb :index
end

post '/' do
  @message = params[:message]
  erb :index
end

__END__
@@ index
<!DOCTYPE html>
<html>
  <head>
    <title>echo</title>
  </head>
  <body>
    <form method="POST">
      <input type="text" name="message">
    </form>
    <p><%= @message %></p>
  </body>
</html>

Uygulamamızı çalıştıralım.

$ ruby echo.rb

Sonuç

Tabii ki http://localhost:4567 adresinden echo uygulamamıza erişebiliriz.