2022-08-19に更新

できるだけわかりやすい Ruby + Sinatra で web アプリ

https://rentry.co/u5pcm

Sinatra

web アプリって何かよくわからなかったので、Sinatra に入門。

https://sinatrarb.com/intro-ja.html

web アプリ

web サーバーを起ちあげて、ブラウザでアクセスして何らかの処理をしたりしなかったりするものを web アプリと呼ぶようだ。
処理をしたりしなかったりする部分をフレームワークで、決まりきったパターンでプログラムを書けるというジャンルにあり、そのなかでもシンプルなのが Sinatra らしい。
python だと cherrypy と似ているのかもしれない。perl だと Dancer というフレームワーク は sinatra にパッと見たところはよく似ている。

web アプリを作ってみる

"webrick" "sinatra" を使って、もっとも単純な処理をする web アプリを作ってみる。もっとも単純な処理だから、基本的にとても短いコードになるので概要をつかむのにはいいはずだ。

所要時間: ゆっくりやってみて 30 分程度。

( web アプリって何か全く知らない場合、どうなってるか理解するには 1 時間から 2 時間程度かかると思います。が、全く知らなくてもわかるので、そのうち。 )

プロジェクトのディレクトリを作る。

~/HelloWorld $ mkdir HelloWorld

bundler のインストール。

( bundler については、一体何するものなのかは、調べてみてください。python だと、venv みたいなものかなぁ。わかってなくても、他の言語やってみたりしたらわかるかもしれない。)

~/HelloWorld $ bundle config set path 'vender/bundle'
~/HelloWorld $ gem update
~/HelloWorld $ gem install bundler 

bundler
https://github.com/rubygems/bundler


プロジェクトのディレクトリに移動。

~/HelloWorld $ cd HelloWorld
~/HelloWorld $ bundle init

Gemfile が作られる。( Go 言語の go mod init みたいな感じだなぁ。)

~/HelloWorld $ ls
Gemfile

Gemfile を編集する。

~/HelloWorld $ vim Gemfile
#frozen_string_literal: true
source "https://rubygems.org"
#gem "rails"
gem "webrick"
gem "sinatra"
~/HelloWorld $ bundle install

"webrick" と "sinatra" がインストールされる。この二つが依存しているプログラムも同時にインストールされる。

WEBrick
https://docs.ruby-lang.org/ja/latest/library/webrick.html
要約
汎用HTTPサーバーフレームワークです。HTTPサーバが簡単に作れます。
WEBrick はサーブレットによって機能します。サーブレットとはサーバの機能をオブジェクト化したものです。ファイルを読み込んで返す・forkしてスクリプトを実行する・テンプレートを適用するなど、「サーバが行なっている様々なこと」を抽象化しオブジェクトにしたものがサーブレットです。サーブレットは WEBrick::HTTPServlet::AbstractServlet のサブクラスのインスタンスとして実装されます。
WEBrick はセッション管理の機能を提供しません。
NOTE: WEBrick は Ruby 3.0 で標準ライブラリから削除されました。Ruby 3.0 以降で WEBrick を使いたい場合は rubygems から利用してください。


views ディレクトリを作る。

~/HelloWorld $ mkdir views

hello.rb, layout.erb, index.erb
3 つファイルを作る。

~/HelloWorld $ vim hello.rb

views ディレクトリに、layout.erb, index.erb というファイルを作っていきます。

~/HelloWorld $ cd views
~/HelloWorld/views $ vim layout.erb
~/HelloWorld/views $ vim index.erb
. HelloWorld # ディレクトリ
├── hello.rb
├── views # ディレクトリ
│   ├── index.erb
│   └── layout.erb
│

Hello sinatra.

~/HelloWorld $ dir
Gemfile  Gemfile.lock  hello.rb  vender  views
~/HelloWorld $ dir views
index.erb  layout.erb

こんな感じです。

. HelloWorld # ディレクトリ
├── hello.rb
├── views # ディレクトリ
│   ├── index.erb
│   └── layout.erb
│    
    # [ bundle init ] したらばできるファイル
├── Gemfile # 編集するファイル
    # [ bundle install ] したらばできるファイル
├── nender # auto generated
└── Gemfile.lock # auto generated


Web アプリの実行

準備できたので、hello.rb を実行したい。bundle exec ruby hello.rb で WEBrick ウェブサーバーをたちあげる。

~/HelloWorld/views $ cd HelloWorld
~/HelloWorld $ bundle exec ruby hello.rb
[2022-08-12 02:07:49] INFO  WEBrick 1.7.0
[2022-08-12 02:07:49] INFO  ruby 3.1.2 (2022-04-12) [arm-linux-androideabi]
== Sinatra (v2.2.1) has taken the stage on 4567 for production with backup from WEBrick
[2022-08-12 02:07:49] INFO  WEBrick::HTTPServer#start: pid=2090 port=4567

chrome ブラウザーでアクセスする。localhost:4567 とアドレスバーに入力して Enter キー。localhost:4567 は、 http://127.0.0.1:4567 のことです。4567 は sinatra のデフォルトのポートナンバーです。

アドレス http://127.0.0.1 のポートナンバー 4567 = localhost:4567

image


どうなっているか見ていくと、

hello.rb の '/' の指し示すのは localhost へアクセスしてきた場合、それはすなわち 127.0.0.0/ で、index.html に相当するファイルへのアクセスということになる。
すると、そこに get でアクセスしてきたら、erb : index を返しますと定義している。

get '/' do
    erb :index
end

:index とは、layout.erb でひな型を用意されているものに、index.erb で用意されている内容が埋め込まれたもののようだ。

layout.erb のなかの

<%= yield %>

が、index.erb の

Hello Sinatra.

に置き換わっているものが :index にあたる。

image

image

hello.rb が実行されると、layout.erb というのが、プロトタイプというか、テンプレのフォーマットで、そこに index.erb が読み込まれるという感じ。

get localhost:4567 で :index ( :index は、index.erb をテンプレートの layout.erb に流し込んだもの ) という感じ。


プログラムコード コピペ用。

HelloWorld/hello.rb
require 'sinatra'

set :environment, :production

get '/' do
    erb :index
end
HelloWorld/views/layout.erb
<html>

<head>
<title>Sinatra framework</title>
</head>

<body>
<h1>hello sinatra</h1>
<%= yield %>
</body>

</html>
HelloWorld/views/index.erb
Hello Sinatra!

もういちどファイルとディレクトリの構図を登場させておきます。

. HelloWorld # ディレクトリ
├── hello.rb
├── views # ディレクトリ
│   ├── index.erb
│   └── layout.erb
│

web アプリの実行は、HelloWorld ディレクトリの hello.rb を実行します。

~/HelloWorld $ bundle exec ruby hello.rb

似たような Hello World が1分30秒で説明されている。

youtube

ツイッターでシェア
みんなに共有、忘れないようにメモ

tomato

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント