Railsで挫折した人のためのSinatra -1-
前回に引き続き記事を読んでくださりありがとうございます。早速、今章からコードを書いていきたいと思います。
今章はRubyの復習と環境構築です。頑張っていきましょう!
Rubyの復習
まず、Rubyがインストールされていることを前提にはじめさせていただきます。
簡単な構文は理解されていると思うので、条件分岐とループにフォーカスしてざっとおさらいしていきましょう。
条件分岐
ここでは詳しい型の分類はしませんが、if文は条件式部分にBooleanというtrueかfalseのどちらかを受け取ります。 その他では0をfalseとして、1以上をtrueとしてInteger型も受け取ったりもします。
if false # 条件式部分
puts "真" # 条件式がtrueの場合
else
puts "偽" # 条件式がfalseの場合
end
# 出力結果 偽
num = 0
if num
puts "真"
else
puts "偽"
end
# 出力結果 偽
特別な書き方もあります。
(条件式)?(条件式がtrueの場合の処理):(条件式がfalseの場合の処理)
isActive = true
puts isActive ? "print true" : "print false"
一行で書けるのでコードもスッキリしますね。
ループ文
なんだかんだeach文が楽なんじゃないかなと思います。
end が個人的になんだかなーと思うので array.each { |引数| 処理 }のように書くことが多い気がします。
fruits = ["apple", "banana", "grape"]
fruits.each {|f| puts f }
# 出力結果
# apple
# banana
# grape
# オブジェクトを含んだ配列をループする場合
fruits = [
{name: "apple", count: 4},
{name: "banana", count: 2},
{name: "grape", count: 5}
]
fruits.each { |f|
puts "名前:#{f[:name]}\t個数:#{f[:count]}"
}
# 出力結果
# 名前:apple 個数:4
# 名前:banana 個数:2
# 名前:grape 個数:5
オブジェクト(Rubyではハッシュ?)の要素へのアクセスは
ハッシュ名[: 要素名]でできます。
最後にクラスについても復習しておきましょう。
クラス
クラスはオブジェクト指向において核となるものでそれ自体の情報や振る舞いを保有しています。
クラスは設計図のようなものでその設計図をもとに作成されたものがインスタンスです。以下例です。
# クラスの宣言
class Human
# 初期化時に引数を保持
def initialize(name, age)
@name = name
@age = age
end
# getterメソッド
def getName
@name
end
def getAge
@age
end
end
# Humanクラスを継承
class Man < Human
end
human = Human.new("Takashi", 24)
print "#{human.getName}\t#{human.getAge}\n"
man = Man.new("Yoshio", 36)
print "#{man.getName}\t#{man.getAge}\n"
# 出力結果
# Takashi 24
# Yoshio 36
以上のようにクラスを書いていきます。
Human.newした結果humanという変数にHumanクラスのインスタンスが入ります。
Humanクラスを継承したManクラスは親であるHumanクラスのメンバを所持しているので設定していないはずのgetNameメソッドを使うことができます。
基本的にgetterと呼ばれる関数でクラスのメンバを読み取ります。
今回はこのぐらい理解できれば問題無く進められるかと思うので、引き続き環境構築へ進みましょう。
Dockerを使った環境構築
それでは、Dockerを使った環境構築をしていきましょう。
Docker for Mac のインストールと docker-composeコマンドを使えるように設定しておいてください。
終わったらまず、好きなところに(どこでもいいです)ディレクトリを作成します。
今回はdesktopにworkspaceというディレクトリを作ってその中にsinatra-appという実際のアプリを作っていきます。
ターミナルで下記のコマンドを入力してください。
$ cd ~/desktop
$ mkdir workspace && mkdir workspace/sinatra-app
$ cd workspace/sinatra-app
このsinatra-appディレクトリの中にちょっと多いですが、5つのファイルを作っていただきます。
- Dockerfile
- docker-compose.yml
- init.sh
- start.sh
- route.rb
の5つです。
Dockerfile↓
FROM ruby:2.5
WORKDIR /app
COPY . .
docker-compose.yml↓
version: '3'
services:
app:
build: .
ports:
- "4567:4567"
tty: true
stdin_open: true
volumes:
- .:/app
command: sh start.sh
init.sh(#!/bin/bashも書きます)↓
#!/bin/bash
bundle init
gem install ruby:2.5
bundle add sinatra
bundle install --path vendor/bundle
start.sh↓
#!/bin/bash
bundle install
bundle exec ruby route.rb -o 0.0.0.0
route.rb↓
require 'sinatra'
get '/' do
'hello'
end
treeコマンドがあれば下記のように見えるはずです。
※ tree コマンドはbrew などでインストールできます。
$ tree .
.
|__ Dockerfile
|__ docker-compose.yml
|__ init.sh
|__ route.rb
|__ start.sh
上記の様にファイルを配置できたら
実際に今作成したファイルを使ってセットアップしていきます。
ターミナルで以下のコマンドを入力してください。
$ sh init.sh
以下のようにパスワードを求められるのでcontrol+Cで終了してください。
出なかったらそのままで大丈夫です。
Your user account isn't allowed to install to the system RubyGems.
You can cancel this installation and run:
bundle install --path vendor/bundle
to install the gems into ./vendor/bundle/, or you can enter your password
and install the bundled gems to RubyGems using sudo.
Password:
すると、sinatra-appディレクトリ以下に
- .bundle
- vendor
ディレクトリと
- Gemfile
- Gemfile.lock
合計4つのディレクトリ及びファイルができていると思うので、
Dockerコンテナを動かして行きます。以下のようなコマンドです。
$ docker-compose build
$ docker-compose up
これでエラーが出ていなければ異常無くコンテナが作成できています。
You must use Bundler 2 or grater with this lockfile.
もし、上記のエラーが出たら、
$ gem install bundler -v 1.17.3
$ rm Gemfile.lock
$ bundle _1.17.3_ install
こちらのコマンドを入力して再度docker-compose upしてください。
http://localhost:4567 にアクセスすると hello と表示されているはずです。
長くなってしまいましたが、軽いRubyのおさらいとDockerを使った環境構築です。
これらのファイルについては現時点では触れませんので興味のある方は別途しらべてみてください。
次章からはいよいよSinatraを使ってアプリケーションを作っていきます。
それでは、お疲れさまでした。