見出し画像

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を使ってアプリケーションを作っていきます。
それでは、お疲れさまでした。

次へ >

いいなと思ったら応援しよう!