6. Railsの準備

6.1. HTTPの基礎

6.1.1. ブラウザとウェブサーバの関係

ブラウザからリクエストを送り、それに対してウェブサーバがレスポンスを送り返す。

リクエスト・レスポンスは1回ごとに完結しているので、前のリクエスト・レスポンスの結果を次のリクエスト・レスポンスに反映させたい場合は、クッキーを使ってブラウザを識別できるようにする。

6.1.2. 静的なウェブページの表示

_images/static-page.png
  • リクエスト:「HTTPメソッド:GET + 見たいページのパス」を送る。

  • レスポンス:パスで指定された位置のファイル(普通はHTML形式)を送り返す。

6.1.3. 動的なウェブページの表示

_images/dynamic-page.png
  • リクエスト:「HTTPメソッド:GET + プログラムへの指示となるパス」を送る。

  • レスポンス:パスに対応した処理を実行し、その結果(普通はHTML形式)を送り返す。

6.1.4. フォームによるデータの送信

  • リクエスト:「HTTPメソッド:POST + プログラムへの指示となるパス + フォームの入力データ」を送る。

  • レスポンス:パスに対応した処理を実行し、その結果(普通はHTML形式)を送り返す。

6.2. 関係データベースの基礎

データを表の形で記憶し、表の操作(関係演算)で必要なデータを取り出す。

Student

id

name

faculty_id

1

太郎

1

2

花子

2

3

一郎

2

Faculty

id

name

1

総合政策

2

環境情報

Studentテーブルにはid, name, faculty_idという三つのカラムがある。最初のレコードは id=1, name='太郎', faculty_id=1 である。

Railsでは、カラム名が _id で終わっている場合は、他のテーブルのレコードを指し示すという約束になっている。例えば、Studentテーブルの中でfaculty_id=1のレコードは、その学生が総合政策(Facultyテーブルのid=1のレコード)に所属していることを意味している。

6.3. Railsの立ち位置

Railsの目的は、CRUD型のウェブアプリケーションを作ることである。CRUDは、次の四つの機能の頭文字を並べたもの。

  • Create 生成

  • Read 読み取り

  • Update 更新

  • Delete 削除

Railsが作ってくれるのは、主にウェブサーバ(Apacheなど)との接続コード、データベース(MySQLなど)との接続コードである。

6.4. MVCという考え方

アプリケーションをモデル、ビュー、コントローラの三つの部分に分けて作る方法。

モデル

アプリケーションで扱う対象をコンピュータ内で表現したもの

ビュー

モデルの内容を人間が分かるように表示する

コントローラ

人間の指示を受けてモデルの更新など各種の処理をする

_images/mvc.png

6.5. Rails環境の準備

Railsのインストールの仕方はいろいろあるが、Dockerコンテナを動かしっぱなしにするのが一番面倒がないのではないか。

_images/docker.png

注釈

これ以後の実行例でプロンプトが $ のコマンドは通常のシェルで実行、プロンプトが # のコマンドはコンテナ内のシェルで実行する。

コンテナを作る。 school はコンテナの名前なので、何でもよい。

$ docker run -itd -v $PWD:/home -w /home -p 127.0.0.1:3000:3000 --name school ruby /bin/bash
  • このコマンドを実行したディレクトリが、コンテナ内の /home にマウントされる。プログラムは、このディレクトリ内に、普通にエディタを使って書く。

  • コンテナ内のポート3000が、外のポート3000とつながっている。127.0.0.1が指定されているので、 localhost でしかアクセスできない。

正しく動いているか docker ps で(または Docker Desktop で)確認する。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                      NAMES
07814ea5c738        ruby                "/bin/bash"         6 seconds ago       Up 3 seconds        127.0.0.1:3000->3000/tcp   school

このコンテナはRubyしか入っていないので、必要なソフトをインストールする。コンテナ内で作業する時は、 docker exec コマンドでシェルを起動する。

$ docker exec -it school /bin/bash

ここからはコンテナ内での作業。

sqlite3のインストール

# apt update
# apt install sqlite3

railsのインストール

# gem install rails
  • これ以後、作業を終了する時にはコントロールDでコンテナ内のシェルを終了する。コンテナ自体は終了せずに動き続けているので、作業を再開する時は docker exec -it school /bin/bash で再びコンテナに接続する。

  • OSの再起動などを行うと、コンテナは停止状態になる。 docker ps で表示されず、 docker ps -a で表示される場合は、 docker start school で動作状態にする。

  • 何かの拍子にコンテナを削除してしまった場合は、最初の docker run からやり直す。コンテナ内にインストールしたソフトは消えてしまうので再インストールが必要。マウントされた(外部の)ディレクトリに書き込んだファイルは残っている。

  • コンテナを削除し、マウントされたディレクトリの内容も全部削除すれば、完全に初期状態に戻るので、黒歴史を無かったことにして人生をやり直すことができる。

6.6. Railsアプリの作成

まずアプリケーション名を決める。これはファイルを置くディレクトリの名前に使われる。ここでは先ほどのコンテナ名と同じ school とする。

rails new で必要なファイル一式を準備する。

# rails new school

docker run を実行したディレクトリの下に新しいディレクトリ school と、さらにその下にいろいろなファイルができる。これを基にしてアプリケーションを作っていく。

注釈

rails コマンド( rails new を除く)や bundle コマンドは、作業ディレクトリが rails new で作ったディレクトリの下でないといけない。次回以降、 docker exec でコンテナに接続したら、まず作業ディレクトリを /home/school にする。

# cd /home/school

6.7. ウェブサーバの起動

Pumaというウェブサーバが付属している。

  • Pumaを起動する。

    # cd /home/school
    # rails server -b 0.0.0.0
    
  • コンテナの外から接続するには -b 0.0.0.0 が必要。

  • デフォルトのポート番号は3000を使用する。コンテナを起動するとき、外部の3000番ポートと接続しておいた。

  • ブラウザで http://localhost:3000/ をアクセスすると、ウェルカムページが表示される。

  • Control-Cで終了

課題10

最終課題で作るシステムのテーマを考えよ。デフォルトは「○○○な人のための Social Network System」で、○○○に入る言葉は自分で考える。これ以外に作りたいものがある人は、自由に考えてもよい。

提出物は企画書。

  1. サイトのタイトル

  2. 機能の説明

  3. 何がうれしいか

最終課題について

  • プログラムの締切は最後の授業が始まるまで(1月19日11:10)。最後の授業は発表会を行う予定だが、人数によっては全員発表できないかもしれない。レポートの締切は1月25日。

  • Rails以外の技術を自分で勉強して組み合わせるのは構わない。ただし、採点対象はRailsを使用した部分。