💎

【Hello World②】Rails @ Ruby

2024/04/03に公開

Javaの次は、言語の発表時期はJavaと同じく90年代中盤と意外と古いが、2000年代後半の「Ruby on Rails」の登場まで日の目を見ることが少なかったRuby言語でHello Worldアプリを作ります。フレームワークは「Ruby on Rails」を使います。

Ruby on RailsでRubyのWebアプリを作ります

①フォルダ・ファイルを作成

以下の構成でフォルダとファイルを作ります。

フォルダ構成
rails
 ├─app            # 空のフォルダ(ここにrailsのアプリを作ります)
 ├─compose.yaml   # コンテナ作成時の指示を記載したファイル
 ├─Dockerfile     # イメージ作成時の指示を記載したファイル
 ├─Gemfile        # インストールするgemを記載したファイル(仮のファイル)
 └─Gemfile.lock   # インストールされたgemが記載されたファイル

PowerShellで以下のコマンドを実行し、フォルダと空のファイルを作ります。
※以降のコマンドは「rails」フォルダで実行します。

PowerShell
mkdir rails; `
cd rails; `
New-Item Dockerfile; `
New-Item compose.yaml; `
New-Item Gemfile; `
New-Item Gemfile.lock; `
code Dockerfile; `
code compose.yaml; `
code Gemfile

「Dockerfile」、「compose.yaml」、「Gemfile」には以下の内容を記述します。

Dockerfile
FROM ruby:3.2.0
WORKDIR /app
COPY ./app/Gemfile ./app/Gemfile.lock /app/
RUN  apt-get update -qq \
  && apt-get install -y build-essential nodejs \
  && bundle install
compose.yaml
services:
  web:
    build: .
    command: /bin/sh -c "rm -f tmp/pids/server.pid && rails server -b '0.0.0.0'"
    depends_on:
      - db
    ports:
      - "3000:3000"
    volumes:
      - ./app:/app
  db:
    container_name      : postgres
    image               : postgres:14.2
    ports:
      - "5432:5432"
    volumes:
      - ./db:/var/lib/postgresql/data
    environment:
      POSTGRES_DB       : testdb
      POSTGRES_USER     : testuser
      POSTGRES_PASSWORD : testpass
Gemfile
source 'https://rubygems.org'
gem "rails", "7.1.2"

※「Gemfile」はrailsをインストールするだけの最低限の記述にしています。

②Gemfile取得

以下のコマンドを実行し、コンテナ内でRailsのプロジェクトを作成して、その際に作られる「Gemfile」をパソコンにコピーします。

PowerShell
docker run -it --rm -v .:/host ruby:3.2.0 `
bash -c "mkdir /app && `
cp /host/Gem* /app && `
apt-get update -qq && `
apt-get install -y build-essential nodejs && `
cd /app && `
bundle install && `
rm /app/Gem* && `
rails new . -d postgresql && `
cp /app/Gem* /host/app/"

コマンドを実行するとappフォルダに「Gemfile」と「Gemfile.lock」がコピーされます。

フォルダ構成
rails
 └─app
    ├─Gemfile        # インストールするgemを記載したファイル
    └─Gemfile.lock   # インストールされたgemが記載されたファイル

③Railsのプロジェクトを作成

以下のコマンドを実行してRailsのプロジェクトを作成します。

PowerShell
docker compose run --rm web sh -c 'rails new . -d postgresql'

※実行中にOverwrite /app/Gemfile? (enter "h" for help) [Ynaqdhm]と聞かれた場合はyを応答
コマンドを実行するとappフォルダの下にrailsのフォルダ・ファイルが作成されます。

④データベースを作成

データベース接続の設定ファイル(database.yml)の内容を修正します。

フォルダ構成
rails
 └─app
    └─config
       └─database.yml

15行目からdefaultについて記述されているので、poolの下にusername、password、hostの記述を追加します。

database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: testuser #追加
  password: testpass #追加
  host:     db       #追加

設定ファイルの修正が完了したら、以下のコマンドを実行し、データベースを作成します。

PowerShell
docker compose run --rm web rails db:create

⑤コンテナを起動

以下のコマンドを実行して、コンテナを起動します。

PowerShell
docker compose up -d

WebブラウザでルートURL(http://localhost:3000)に接続して、railsのデフォルトページが表示されることを確認します。

⑥コントローラとビューを作成

以下のコマンドを実行して、helloというコントローラとビューを作成します。

PowerShell
docker compose exec web rails g controller hello index

コマンドを実行すると、コントローラ「hello_controller.rb」、ビュー「index.html.erb」が作成され、ルート定義ファイル「routes.rb」にhello/indexの定義が追加されます。

フォルダ構成
rails
 └─app
    ├─app
    │  └─controllers
    │  │  └─hello_controller.rb
    │  └─views
    │     └─hello
    │        └─index.html.erb
    └─config
       └─routes.rb

Webブラウザから/hello/index(http://localhost:3000/hello/index)に接続すると、ビューのデフォルトの内容が表示されます。

⑦コントローラとビューの内容を変更

「hello_controller.rb」と「index.html.erb」を以下の内容に変更します。

【変更前】hello_controller.rb
class HelloController < ApplicationController
  def index
  end
end
【変更後】hello_controller.rb
class HelloController < ApplicationController
  def index
    @msg = 'Rails on Docker'; #追加
  end
end
【変更前】index.html.erb
<h1>Hello#index</h1>
<p>Find me in app/views/hello/index.html.erb</p>
【変更後】index.html.erb
<h1>Hello World <%= @msg %></h1>

Webブラウザから/hello/index(http://localhost:3000/hello/index)に接続して、以下の画面が表示されれば完成です。

Discussion