【2回目】Railsに挫折中の人が、Ruby/Sinatraから再入門してみた(全7回)

5/11より毎週土曜日、株式会社X-HACK主催の勉強会、
【全7回】Ruby / Vue.js「ゼロから」ウェブサービスを作る【初心者向け | 個別指導あり】
に参加しています。
学んだことをこちらでアウトプットしていきます!

今回は2回目!DB 、SInatra、Git入門から深〜い話まで面白かったです!
間違っている記述などあれば教えていただけると嬉しいです!

1.Rubyをどうやってデータベースにアクセスさせるか

⭐︎そもそもなぜデータベースは必要か

 もちろんテキストファイルに情報を保存することもできるが・・・

【メリット】
 ・安全かつ、壊れにくいように工夫されて作られている
 ・データ型を設定できる(整数、浮動小数点数、文字、日付、真偽値など)
  →①メモリ節約できる(余計な領域を確保しなくて良い)
   ②制限をかけられる
  →例)年齢と住所逆に入力したデータを保存してしまったら困る
 ・トランザクション処理が可能
  →例)①Aさん10万円→Bさんに送金
     ②Bさんへの講座への入金処理途中でエラー発生!
     ③Aさんの10万円は戻らず、Bさんの講座も10万円が増えないことに。
   →これじゃ困ってしまう!
    こんな時にトランザクション処理があれば、一連の処理はキャンセルされAさんの10万円は戻ってくる!
  ・共同編集が可能(エクセルなどとは違う)
  ・データ検索が早い

DBの種類→PostgreSQL、SQlLite、MySQL、MongoDB、MariaDBなど

マスターデータ:顧客の情報、商品の詳細データ、固定的なデータ
         データ量:少
 トランザクションデータ:取引データ、随時追加される流動的なデータ
         データ量:大

メモリ:揮発性(一時的なデータを格納)、超高速なのが利点
     プログラム上の変数などもメモリで管理
 HDD(SSD)ストレージ→非揮発性(永続的なデータを格納)

とにかく、データベース使うと便利!使ってみましょう!

⭐︎実践!データベースを連携させてみよう

Rubyプログラム起動

$ ruby sample.rb

DBアクセスするためのプログラム実行し、DBアプリケーションと接続

#sample.rb

require "rubygems"

# postgres通信用のライブラリ
require "pg"

begin
 # 1 DBアクセス接続する
 conn = PGconn.connect('localhost',5432,'','','test_db','rdera','')
 # 2 DBにSQLを送る
 q    = "select * from hoge_table"
 # 3 DBアプリケーションは、プログラムに結果を渡す
 res  = conn.exec(q)
 # 4 ハッシュや配列でデータベースからデータを取得
 res.each do |r|
  # 5 受け取った結果を利用して処理を行う
   p r
 end

rescue PGError => ex
 # PGError process
 print(ex.class," -> ",ex.message)
rescue => ex
 # Other Error  process
 print(ex.class," -> ",ex.message)
ensure
 conn.close if conn
end

⭐︎連携したRuby+DBのデータをウェブに表示したい場合は?

 1. リクエスト(一覧見せて、削除してなど)に応じて、
  先ほどのsample.rbのようなRubyプログラムを実行!
 2. その処理結果をブラウザに返して表示!
 
 ざっくりこういった流れ!

2.sinatraの基本

Rubyで書かれたWebアプリケーションフレームワークのひとつ

⭐︎フレームワークとは?

 →アプリケーションを作るのに共通した処理がまとめられているので便利
 ・ruby→Ruby on Rails
 ・PHP→Laravel
 ・Python→Django
 などが有名

⭐︎Sinatraとは?

 ・歌手のフランクシナトラが名前の由来!!(驚き)
 ・Ruby on Railsはフルスペックなフレームワークのため作法がいっぱいある。
 ・シンプルなフレームワーク!
  シンプルなアプリはSinatraで十分!
 ・Sinatraを実務で使っているところもある!
  →GitHubも当初はSinatraを使用していた
 ・学習に最適!
  Railsは、Rubyなどを熟知していれば開発効率が格段に良いが、
  初心者は逆に何をしているか見失いやすい(僕のこと)

⭐︎実践!Sinatraを使ってみよう

ディレクトリを作り、そこへ移動する

$ mkdir first-sinatra
$ cd first-sinatra

直下にapp.rbとviewsディレクトリ内にtest.erbを作成
 *erbとは?
  html内にrubyを埋め込めるファイル形式
  他にはslim/hamlなどが使われる
 *Sinatraのお作法
  直下にapp.rbとviewsディレクトリ(erbファイル格納)を作成する

$ touch app.rb
$ mkdir views
$ touch views/test.erb

bundlerを使用するためbundle initを実行

$ bundle init

bundle init実行できない場合、bundleのgemをインストール

$  gem install bundler

作成されたGemfileにgem 'sinatra'を追記

source "https://rubygems.org" # これは削除しない

gem 'sinatra'

※Gemfileに `gem 'sinatra-contrib'` を追記すると、コードの変更時にRubyファイルを自動的に再読み込みします。
railsだとオートローダーが自動的に組み込まれている

gemをインストール

$ bundle install

次にプロジェクトフォルダ(first-sinatra)直下にapp.rbを作成し、ルーティングを設定。
以下では、『localhost:4567/hello』が呼ばれると、「hello」が表示される

# app.rb

# インストールしたライブラリを読み込む
require 'sinatra'
require 'sinatra/reloader'

# ルーティングを設定
get '/hello' do
 'hello'
end

# erbファイルを呼ぶ 
get '/time' do
 erb :test2
end

⭐︎エラーをしっかり読んで開発していこう!

 sinatraはエラー原因が、詳細かつ親切に書かれている!例

 例1「Sinatra dosen't know this ditty.」設定されたルーテイングがないよ〜
  「Try this」にしたがってルートを設定すれば表示できるよ!

 例2「No such file or directory~」ルートで設定されたerbファイルがないよ〜
   GET,POST,COOKIES,ENVのエラー原因を詳細に書いてくれている

英語に臆せず、エラーがしっかり読めるようになれば一人前!!

*静的なファイル(test.htmlなど)を表示させるには?
 1. publicディレクトリを作成し、test.htmlをpublicディレクトリ内に入れる。
 2. Sinatraの実行順序としてapp.rbのルーティングをまず見る→なかったらpublic内を見るという順番。
 3. 「localhost:4567/test.html」を呼び出すと、test.htmlが呼び出される

3.アプリケーションサーバーとwebサーバーの違い

ざっくりと解説すると、
アプリケーションサーバー→Rubyプログラムを実行するために必要なサーバー。(例)puma,Webrick,Unicornなど
webサーバー→ユーザーから送られてきたリクエストを受け取り、なんらかの処理を加えるためのサーバー。

⭐︎HTTPリクエストの流れ

①ユーザーからリクエスト
 ↓
②webサーバー
 ↓
③アプリケーションサーバー
 ↓
④Rubyプログラムを解釈
 ↓
⑤アプリケーションサーバー
 (必要に応じて)DBサーバーにデータを依頼
 ↓
⑥webサーバー
 ↓
⑦ユーザーへレスポンス

(参考)Rails開発におけるwebサーバーとアプリケーションサーバーの違い(翻訳)

⭐︎式と文について(難しい概念!あやふやです!)

・Rubyの設計思想
 →ほぼ式が使われている

・式と文とは?
 式:expression
  →戻り値を使うもの
 文:statement
  →戻り値を使わないもの

 例)test = 1 + 2
  test = 1 + 2の全体:文
  右側 の1 + 2は:式

・式と文でなにが区別されているか
 test = sum(1, 2)
  →戻り値を使っているので、式
   なので、()が必要
 attr_accessor :name, :age
  →戻り値は使わない
   なので、()がいらない

(参考)https://magazine.rubyist.net/articles/0039/0039-ExpressionAndStatement.html

4.Git(バージョン管理ツール)とGithub

⭐︎なぜ必要か?

普段の業務で「20190518作業報告書.xlsx」、「(最新)作業報告書.xlsx」などのファイルを見た経験ありませんか?
そんな時、どのファイルをいじればよいかわからなくなってしまう!

⭐︎そんなゴタゴタを解決するのがGit

いつ、なに、だれによってがわかりやすくなる
 ・ファイルを変更前に戻すことができる
 ・チームで共有してファイルを編集できる
 ・コンフリクト(競合!どっちが合っているの?)を教えてくれる

⭐︎実践!Gitを使ってみよう

1. 追跡したいディレクトリに移動し、追跡開始

$ cd first-sinatra
$ git init

2. 何かを変更したら、現在の状況を確認

$ git status

3. ファイルを指定して、バージョン管理を開始

$ git add app.rb

全てをgitで管理したい場合

$ git add . か $ git add -A

4. コミット(変更履歴を保存)する

$ git commit -m "最初のコミット"

5. 差分を確認

git diff <file-name>

6. ファイル変更を戻したい
 戻す対象のハッシュ値を調べて、resetする
 *ただ誤って削除した時戻れないので、reset --hardは危険

$ git log
$ git reset --hard <ハッシュ値>

ソースツリーは行単位でコミットできる
 コマンドではファイル単位でしかコミットできない

⭐︎Githubとは?

 クラウド上でコードを管理してくれる。
 共同で開発するのに便利!
 もしパソコンがなくなっても大丈夫!

⭐︎実践Githubにpushしてみよう!

リモートリポジトリ(GitHub上の格納庫)を登録する

$ git remote add origin git@github.com:your-account/repository-name.git

ローカルの内容をリモートリポジトリに送信する

$ git push -u origin master

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