【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