Ruby on Railsで作る「帳票系アプリケーション」

はじめに

前著「Ruby on Railsで作る
『イベント告知サイト』」を書き終えて早6年。 スタートアップ系のウェブアプリ開発トレンドはJavaScript(TypeScript)に移ってしまったのかなぁ、という感も正直なところ無きにしもあらずです。

previous

しかしながら、Railsの「高速プロトタイピング」の強みはまだまだ消えていないように筆者は考えています。 リレーショナル・データベースのアーキテクチャも枯れたと言われて久しいですが、 引き続き今でも多くのビジネスシーンで利用され、情報化社会を下支えしています。

絶頂期は過ぎたけど、歴史と深みのある大人のフレームワークとしてこれからもまだまだ動き続けるんじゃないかと、 希望も込めながらもう一度このテーマで文章をまとめてみようと思い立って筆を執りました(キーボードに手を置きました?)。

Ruby on Railsを体系的に学ぶには「Railsチュートリアル」や「Railsガイド(https://railsguides.jp/)」という有名なウェブサイトの利用をオススメします。本書はこうした網羅的なドキュメントには及びませんが、ちょっとした読み物的な感じで、イチ開発者の目線からみたRailsの現状や開発のコツなどに触れて頂ければ幸いです。

対象読者・前提知識

Macの基本的な操作に加え、後述するAtomのようなプログラミング向けのテキストエディタの基本的な取り扱い、及びターミナルの操作ができることを前提とします。書籍内でも必要な説明は適宜挟みますが、Rubyを仕事などで実用的に使って行きたい場合は「UNIXコマンド」と端末の操作についても並行して学んでおくことを推奨します。多くのRuby実行環境では、これらは切っても切り離せない関連性があります。巻末に「付録」として主要なUNIXコマンドの解説を付記しています。

Windows環境でもRubyをインストールすることで、原則として同じことが可能です。ターミナルアプリの操作をコマンドプロンプトに置き換えて頂ければ、ほとんどは動作するはずです。しかしながら、本書ではWindowsでの利用を想定した解説は行いませんので、予めご了承ください。

本書は、「完全な初心者」をターゲットにした入門書ではありません。解答編でなるべく説明はこころがけますが、基本的には読者自身の「調べる力」の涵養を目した構成になっています。つまり、問題が与えられた時に「今の自分にこれを解くことが出来るか?」という判断に、まずは全力で取り組んで貰いたいと思います。そして「今の自分に足りない知識は何か?」と、問いを進めてみてください。最終的に正解にたどり着かなくても、これらの問いを繰り返すことで、「自分が学ぶべきこと」の概形がぼんやりとでも見えてくれば、学びのステップは確実に一歩進んでいます。

前書との違い

Vagrant -> Docker Bash -> Zsh Ruby2.1 -> Ruby2.7 Rails6.1?

環境構築(一般)

最初に強みとして紹介した「高速プロトタイピング」をいきなり否定する話になってしまいますが、 Railsはここで躓く人が多いのではなかろうか、と考えています。rails newと打ってプロジェクトを 開始するまでが意外とハードルが高い。名前の通りレールの上を走ればあっというまに遠くまで行ける、 そういう思想のフレームワークだったはずなんですが、Rubyという処理系、そして周辺のライブラリが 多様な環境で動作するようになった代償として、あまりにも色んなタイプのレールが存在しすぎているような気がします。

例として、筆者が現在管理していたり、導入を検討してみた環境を以下に挙げてみました。

ざっくりと言うと、OSの上にRubyを載せて、その上にRailsが乗っかるイメージです。 全て問題なく動作している限りにおいては、それぞれの違いを意識することはないのですが、、 それはあくまで理想的な状況であって、実際には上記の組み合わせ次第で様々なエラーに出くわします。

インターネット上に解決策が存在している、と言っても、それがどの組み合わせに対して有効なものなのか…はっきり言って大抵の人はゲンナリしてしまう複雑さだと思います。上述のRailsチュートリアルを読んでも、冒頭のから「〜の環境の場合は」という注意書きが多いことに気づかれると思います。これこそが、 Railsが広く普及した証左でもあるのですが、新規の参入者を戸惑わせるポイントにもなっていると思います。

macOS

https://www.apple.com/macos/big-sur/

Apple社の開発するUNIXベースのオペレーティング・システムです(2021.01時点の最新版は「Big Sur」)。シンプルなユーザインタフェースや操作性が特徴として挙げられることが多いですが、開発者にとっては「UNIXベース」である、という点がより重要になってきます。Termnal(ターミナル)というアプリを介して、CUI(コマンドライン・ユーザ・インタフェース)から様々な機能を呼び出すことが出来ます。後述するRailsやDockerもCUIからの操作を前提としていますので、Terminalを操る知識はほとんど必須と言っても過言ではないでしょう。

Terminal.app

macOSに標準添付されているアプリケーションです。「端末エミュレータ」と呼ばれることもあります。この中でさらに「シェル」と呼ばれるプログラムが起動し、ユーザからのコマンド入力やバックグラウンドプロセスを処理します。「Zsh」という名前のシェルプログラムが標準で起動します。このアプリの使い方は実際の開発や運用の現場で非常に重要になってくることがありますので、興味のある方は「Zsh」関連の書籍や情報にも目を通しておかれることをお勧めします。

ATOM

https://atom.io/

「21世紀のテキストエディタ(自称)」を標榜するちょっとお洒落な感じのエディタです。GitHub社が開発しています。使い勝手としてはSublime Textなどに近く、AptanaやRubyMineなどのIDEと比べると汎用的ですが、静的な型付けが無く、メソッドやフィールドを動的に追加でき、括弧の省略記法など自由度の高いRubyという言語の開発に於いては、リファクタリングなどの機能が活躍できる範囲はそもそも限られています。これくらいの機能性が調度良いのではないかと筆者は感じています。Gitリポジトリの状態に応じてファイルツリーの色を調整してくれたり、Markdown形式のテキストのプレビューをしてくれたり、と痒いところに手が届く機能が最初からひと通り揃っているのも魅力です。

MySQL

http://www.mysql.com/

世界で最も有名なオープンソースのデータベースシステムです。Oracle社に買収され先行きが危ぶまれましたが、現在も積極的に開発が続けられており、安定性や機能面には定評があります。本書では、このエンジンを使ったシステム運用を想定してゆきます。

Ruby

https://www.ruby-lang.org/

本書を読まれている方ならご存知でしょうけれども、折角なので改めてご紹介を。Rubyはオブジェクト指向のLL(ライトウェイト)言語です。PerlやPythonなどと並び世界的に利用されるメジャーな言語です。筆者は元々、Pythonを利用していましたが、日本語を扱う際の親和性などが気に入り、こちらに鞍替えしてきた経緯があります。実際に使ってみるとその柔軟な構文と拡張性の高さにすっかり魅了されること請け合いです。

Rubygems

https://rubygems.org/

Rubyのパッケージ管理ツールです。Linuxを使われる方ならaptやyum、(大雑把に言えば)MacのApp StoreやGoogleのGoogle Playなどを想像して頂ければ良いかもしれません。Rubyの開発に利用できる各種ライブラリやフレームワークが公開されていて、コマンドラインからそれらをインストール・管理することができます。このツールで配布される個々のライブラリやフレームワークは「gem(ジェム)」と呼ばれます。

Bundler

http://bundler.io/

Bundlerはgemの依存性を管理するためのツールです。gemは便利な仕組みですが、長期間に渡って、或いは多数のプロジェクトを同一ホストで同時並行的に運用する場合に、バージョン番号の不整合が起こってくることがあります。例えば、あるプログラムは古いバージョンのままのライブラリが必要な一方で、別のプログラムは新しいバージョンでなければ動かない、というような状況です。Bundlerはこの問題を解決してくれます。Ruby on railsで新しいプロジェクトを作成すると、自動的にBundlerのセットアップを行います。

Ruby on Rails

http://rubyonrails.org/

最後に紹介するのが、本書の主役、Ruby on Railsです。手軽にデータベースと連携したウェブアプリを立ち上げることができるウェブブレームワークとして(一部の業界では)一世を風靡しましたが、今は押しも押されもせぬ地位に収まった感があります(筆者の主観ですが)。WebrickとSQLiteという簡易ウェブサーバとデータベースを使って、ものの数分でアプリが立ち上がるスピードは確かに目を見張るものがありますが、一方で、これらの組み合わせでは実運用に耐える構成にはそのまま持ち込めないという問題もあります。つまり、プロトタイピングにはとても便利なのですが、運用までしっかり検討しだすと、実はそれほどのスピード感はない、というのが実情ではないでしょうか。しかしながら、冒頭でも述べたように、「プロトタイピング」用途での優位性はありますし、その他にも優れた機能を多く有していることも間違いありません。本書で実際にアプリケーションを構築するプロセスを通して、じっくりと一つ一つRailsの強力な機能を使いこなせるようになってゆきましょう。

Docker

TODO

環境構築(本書のサンプル用)

Docker公式のrailsインストール手順に書かれている手順は残念ながら、Rails5までのもので、6に適用させるには幾つか書き換えが必要です。

様々なアプローチがあって、残念ながらまだ至高のDockerfileには出会えていないのですが、、弊社で実際に利用しているDockerfileを掲載します。

#
# Alpine image (mainly)for Rails project.
#
# 2021.01.11 aims for Rails 6. PostgreSQL and Sqlite are included.
FROM ruby:2.7.2-alpine3.12

RUN apk update && apk upgrade \
  && apk add --no-cache build-base \
    postgresql-client postgresql-dev \
    imagemagick6 imagemagick6-dev imagemagick6-c++ readline-dev \
    sqlite-dev nodejs tzdata yarn \
  && gem update \
  && gem install rails -v '~> 6.1' -N \
  && gem install pg rmagick sassc sqlite3 -N
RUN apk add --no-cache nano
# RUN apk add --no-cache mysql-client mysql-dev && gem install mysql2

WORKDIR /home

まずは、このファイルを以下の容量でビルドして、イメージを作成してください。e704721はこのファイルを保管しているGitのコミットIDから取っていますが、ここは一意に管理できるものであれば、何でも構いません(通し番号とか日付とか)。以降の説明で使いやすくするためlatest(最新)のタグも追加しています。

docker build --tag lm-ruby-alpine-rails6:e704721 . -f lm-ruby-alpine-rails6
docker tag lm-ruby-alpine-rails6:e704721 lm-ruby-alpine-rails6:latest

上記のイメージを使ったdocker-compose.ymlの構成が以下のようになります。

version: '3.8'
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - ./tmp/postgresql/data:/var/lib/postgresql/data
  web:
    image: lm-ruby-alpine-rails6:latest
    command: sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - ./:/home
      - bundle:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
  bundle:

この内容のdocker-compose.ymlというファイルを新しいディレクトリに置いて、プロジェクトの作成を開始することができます。

mkdir practice-rails1 && cd practice-rails1
docker-compose run web rails new . --database=postgresql --skip-git

プロジェクトの作成の中で、Railsが必要とするライブラリのインストール(bundle install)とJavaScriptのライブラリのインストール(webpacker)が動作するため、ある程度時間がかかります。気長に待ちましょう。

また、恐らくvolumesの設定が不完全なのですが、以下のようなエラーも途中で出てきてしまうことがあります。個別に gem uninstall をして掃除することで解消は出来るのですが、まだ現在のバージョンでは根本対応に至れていません。

/usr/local/lib/ruby/2.7.0/fileutils.rb:105: warning: already initialized constant FileUtils::VERSION

Ruby on Rails実装編

前章までに開発用の環境が整いましたので、ここから実際に動作するアプリケーションの構築にかかろうと思います。まず最初に作るのは、とてもシンプルなお問い合わせフォームです。以下のように仕様(やりたいこと)を決めてみましょう。

とりあえず上記のようなシンプルなウェブサイトを目指してみましょう。データベースエンジンにはPostgreSQLを使って、デザインはBootstrapでお手軽に済ませてしまうこととします。

まずは新しいRailsアプリケーションを作成します。「–database=postgresql」オプションを指定することでデフォルトのSQLiteの代わりにPostgreSQLを利用できるようになります。SQLiteでお手軽に作ることも可能ですが、後々サーバへ配備して拡張性も考慮していこうとなると、PostgreSQLやMySQLなどの本格的なエンジンに載せ替えていく必要性が出てきますので、はじめからこちらを使ってゆくことにします。

空のプロジェクトを作成

前節と同じ内容ですが、もう一度プロジェクトを作成します。この節から開始する読者向けに書いていますので、前節のプロジェクトをリネームして使いまわしても構いません。

mkdir practice-rails1 && cd practice-rails1
docker-compose run web rails new . --database=postgresql --skip-git

プロジェクトの雛形が生成されたら、config/database.ymlを編集して、データベース接続をこのDockerの構成に合わせたものに変更します。default設定に下記の項目を追加します。

  host: db
    username: postgres
    password: secret

その後、空のデータベースを作成し、docker-compose upを実行するとローカル環境にRailsのwebサーバ(Puma)が立ち上がります!

docker-compose run web rails db:create
docker-compose up

以下をブラウザのアドレスバーに打ち込むと…

http://localhost:3000/

以下のような画面が表示されたら、ここまでは順調です!

Yay! you’re on Rails!

お問い合わせの骨組みを作る(scaffold)

先程、docker-compose upを実行したターミナルでは、PostgreSQLとRailsのWebサーバが引き続き動作しています。終了する場合はCtrl+Cを入力します。ここからの作業は、このサーバを立ち上げたままの状態で行いますので、もう一つ新しいターミナルのタブまたはウィンドウを準備してください(ディレクトリも同じ“practice-rails1”に居る状態にします)。

以下のコマンドを入力します。\(バックスラッシュ)記号は、紙面の都合で折り返しをする場合に付けているもので、実際には続く行もひと繋がりのコマンドです。

docker-compose exec web rails g scaffold inquiry \ 
  name email purpose:integer body:text
docker-compose exec web rails db:migrate

このコマンドを実行すると各種のファイルが生成され、以下のURLにアクセスすると、

http://localhost:3000/inquiries

このような画面が表示されます。

Inquiries

「Create Inquiry」というボタンを押すと、新しいお問い合わせを作成する画面に遷移します。 ここが今回、ユーザがお問い合わせを送信する画面になります。

Create Inquiry

purpose列は、冒頭に定義した問い合わせの種類、例えば質問・見積依頼・苦情などを格納するために作成しています。 他の列と同様に文字列型で定義して、データベースを直接覗いても、中身がわかるようにした方が、 運用面では便利ではありますが、今回、異なるタイプの型も扱ってみたいのであえて数値(integer)型を使っています。 body列も同様に、一般的な問い合わせ本文だと長くても数百文字程度かと想定されますので、文字列型で良いのですが、 異なるタイプの文字型(text)を指定しています。

この辺り、Railsが簡単そうに見えて実は運用で落とし穴にハマる最初のポイントになるかと思います。 どんな型を選ぶかという決定がリリース後の運用や規模拡大の際の設計に大きく影響します。 どのデータベースエンジンを選ぶかによっても適切な列の型は変わりますので、総合的な判断が必要です。

メールを送信する

RailsにはActionMailerというメール送信のための仕組みがを作成します。 先程のscaffoldと同様に、必要なコードの雛形を自動生成することが出来ます。 以下の例ではsent(問い合わせをしたユーザに送る受付確認)とreceived(管理者に問い合わせがあったことを知らせるメール) という2つのメールを送るメーラをnotificationsという名前で定義しています。

docker-compose exec web rails g mailer notifications sent received          

実際にメールを送出する処理は、コントローラ内に記載します。

app/controllers/inquiries_controller.rb

# POST /inquiries
# POST /inquiries.json
def create
  @inquiry = Inquiry.new(inquiry_params)

  respond_to do |format|
    if @inquiry.save
      NotificationsMailer.sent.deliver_later
      NotificationsMailer.received.deliver_later
      format.html { redirect_to @inquiry, notice: 'Inquiry was successfully created.' }
      format.json { render :show, status: :created, location: @inquiry }
    else
      format.html { render :new }
      format.json { render json: @inquiry.errors, status: :unprocessable_entity }
    end
  end
end

この状態で、問い合わせを適当に作成してみると、docker-composeが起動しているターミナルに以下のようなログが書き出され、 Railsがメールを送信しようとしてくれていることが確認できます(この環境では実際にメールが飛んでいくことはないです)。

web_1  | [ActiveJob] [ActionMailer::MailDeliveryJob] [638b5a34-184d-49fd-b366-1c331aeb9695] Date: Mon, 18 Jan 2021 00:47:41 +0000
web_1  | From: from@example.com
web_1  | To: to@example.org
web_1  | Message-ID: <6004daadb40ae_14d3015746@bdaa1bce2230.mail>
web_1  | Subject: Sent
web_1  | Mime-Version: 1.0
web_1  | Content-Type: multipart/alternative;
web_1  |  boundary="--==_mimepart_6004daadac24b_14d3015687";
web_1  |  charset=UTF-8
web_1  | Content-Transfer-Encoding: 7bit
web_1  |
web_1  |
web_1  | ----==_mimepart_6004daadac24b_14d3015687
web_1  | Content-Type: text/plain;
web_1  |  charset=UTF-8
web_1  | Content-Transfer-Encoding: 7bit
web_1  |
web_1  | Notifications#sent
web_1  |
web_1  | Hi, find me in app/views/notifications_mailer/sent.text.erb
web_1  |

メールサーバの設定については、最終節の配備のところで実際に試してみたいと思います。 ここでは、ログ上で送信しようとしているメールが確認できればOKとします。

認証を付ける

お問い合わせが送信されて、データベースにレコードが登録されるようになりましたが、 このままでは、誰でもお問い合わせの履歴が見えてしまいます。 BASIC認証というシンプルな仕組みを利用してパスワードを知らないユーザにはアクセスが 出来ないようにしてしまいましょう。app/controllers/application_controller.rbに 以下のような関数(authenticate)を定義します。 このクラスにはアプリケーション全体で利用できるメソッドや変数を定義することができます。

class ApplicationController < ActionController::Base
  def authenticate
    authenticate_or_request_with_http_basic do |username, password|
      if (username == "kanri" && password == BASIC_AUTH_PASSWORD)
        session[:user] = username
      end
    end
  end
end

本質的な対策ではない、ちょっとしたテクニックですが、管理者の名前としての adminroot などは、 一般的すぎてブルートフォースアタックの標的にされやすいということがあります。 ここで定義する名前は管理者にしか思いつかないような、一般的でないものの方がちょっとだけ安全です。

パスワードは、config/initializers/practice-rails1.rbという新しい設定ファイルを用意して その中に以下のように定義し、環境変数から読み取ってくることとします。

BASIC_AUTH_PASSWORD = ENV['BASIC_AUTH_PASSWORD'] || "secret"

TODO: rails credentials:edit EDITOR=“vim” と Rails.application.credentials.basis_auth_password を利用する方法も追加。docker使ってるとめんどくさいです。。

app/controllers/inquiries_controller.rbの一番上の部分で以下のように呼び出します。 お問い合わせの新規作成は誰でもアクセスできる必要があるので、それらは除外します。

  before_action :authenticate, except: [:show, :new, :create]

一般ユーザが問い合わせをするとRailsのコントローラ上では new -> create -> show という順番で処理が遷移します。 送信完了した際にshowが呼ばれるのですが、ここに認証無しで詳細を表示してしまうと、やはり情報漏えいのリスクに繋がります。

上記authenticateメソッドでセットしたsession[:user]変数を利用して、ログイン済みの管理者であれば詳細を ログインしていない一般ユーザであれば、(問い合わせ送信後にしか表示されないので)お礼のメッセージのみを返すように、 app/views/inquiries/show.html.erbを変更します。

<% if session[:user] == "kanri" %>
  <p>
    <strong>Name:</strong>
    <%= @inquiry.name %>
  </p>
  : (中略)
  <%= link_to 'Edit', edit_inquiry_path(@inquiry) %> |
  <%= link_to 'Back', inquiries_path %>
<% else %>
  <p>Thank you for the inquiry!</p>
<% end %>

レスポンシブ対応にする(bootstrap)

このままでも、最低限の機能はありますが、スマホファーストのこのご時世に流石にちょっと物足りないかもしれません。 Bootstrapというレスポンシブのフレームワークを入れて、スマートフォンから閲覧しても使いやすいインタフェースに書き換えましょう。

https://getbootstrap.com/

幾つか方法がありますが、ここでは一番お手軽にCDNを使う方法を紹介します。 21年1月時点、バージョン5が最新ですがまだβ版のため、4系の最新版を指定します。jqueryも必要なためslim版が指定されています。

<html>
  <head>
    : (略)
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
  </head>
  <body>
    : (略)
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx" crossorigin="anonymous"></script>
  </body>
</html>

Rails5系までの場合、bootstrapというgemをインストールしていました。 6系ではyarnを使って導入する方法もあるようなのですが、どうもまだ手順が確立されていない印象を受けました。 yarn addした後に書き換えなければいけない箇所が多くて大変そうです。CDNはお手軽ですが、 ソースを配布してくれるサイトが落ちていたりすると一緒に影響を受けてしまうことがあるため注意は必要です。

docker-compose exec web yarn install bootstrap@4.5.3

app/stylesheets/scaffolds.scssのスタイルがBootstrapと競合してしまうことがあるため、こちらを削除しておきます。

これで、Bootstrapの導入ができましたので、あとは既存のHTML(.erb)をBootstrapの流儀で修正してゆきます。 ここから先はどんなデザインのサイトにしたいかによって幾つかのパターンがあると思いますが、ひとまずシンプルな例を紹介します。

まずは、app/views/layouts/application.html.erbの中のyieldを以下のdivタグで囲っておきます。

  :
  <body>
    <div class="container">
      <%= yield %>
    </div>
  :

続けて、app/views/inquiries/new.html.erbを以下のように修正します。

<div class="row">
  <div class="offset-md-3 col-md-6">
    <h1>New Inquiry</h1>

      <%= render 'form', inquiry: @inquiry %>

      <% if session[:user] == "admin" %>
      <%= link_to 'Back', inquiries_path %>
      <% end %>
  </div>
</div>

app/views/inquiries/_form.html.erb内のフォームの要素には以下のようにクラス名を追加します。

  : (省略)
  <div class="form-group">
    <%= form.label :body %>
    <%= form.text_area :body, class: "form-control" %>
  </div>

  <div class="actions">
    <%= form.submit nil, class: "btn btn-primary" %>
  </div>
<% end %>

app/views/inquiries/index.html.erbもこんな感じでクラスを追加してみます。

<table class="table table-striped">
  :
        <td><%= link_to 'Show', inquiry, class: "btn btn-light btn-sm" %></td>
        <td><%= link_to 'Edit', edit_inquiry_path(inquiry), class: "btn btn-light btn-sm"  %></td>
        <td><%= link_to 'Destroy', inquiry, method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-danger btn-sm" %></td>
  :
<%= link_to 'New Inquiry', new_inquiry_path, class: "btn btn-primary"  %>






### 画像も投稿できるようにしてみる

ActiveStorage



### テストを実行する


### もっと知りたい時


https://rubygems.org/

gem ‘devise’, ‘~> 4.7’ gem ‘font-awesome-sass’, ‘~> 5.12’ gem ‘jquery-rails’, ‘~> 4.4’ gem ‘paper_trail’, ‘~> 10.3’


### うまく行かなかった時

scaffoldをやり直したい時は、destroyサブコマンドが使えます。

docker-compose exec web rails destroy scaffold inquiry


動作がおかしくなってしまった時は、Dockerを再起動すると改善することがあります。
特に`docker-compose run`で沢山のコンテナを立ち上げっぱなしになっている場合など、時々`down`を実行すると良いでしょう。

docker-compose down


データベースを削除して再作成する場合、`db:drop`が使えます。

docker-compose run web rails db:drop db:create ```

Ruby on Rails実装編

サイト名:events.lmlab.net 仕様(やりたいこと): 勤務実績報告書を

ペーパレス化を言っておきながら、紙を出力するアプリを作る…

配備・運用編

Herokuに置く

AWS Elastic Beanstalk?

補遺

参考資料

本書について

本書は、宮崎県ソフトウェアセンター様主催の集合研修向けリソースとして、6年前に書いた「Ruby on Railsで作る
『イベント告知サイト』」を再構成する形で編成しました。

「CC BY 4.0」に則った再利用・再頒布が可能です。

著者紹介:伊藤陽生 株式会社ランバーミルの代表取締役。中小規模のシステム開発を経験は20年近く続けています。 Cから始まりJava、JavaScript、Objective-C、PHP、 Python、SQLなどを主に業務で扱っています。Linuxサーバの構築だったり、ウェブサイトのデザインをしたり、これらの分野の研修講師として働いていたこともあります。技術の移り変わりの 速いこの領域においては、それぞれの経験値そのものよりも、いかに新しい技術にうまくキャッチアップし、チームで共有し、身近な問題の解決に結びつけられるか、という、もう一段抽象的な技能こそが重要なのではないかと考えています。

本書に関するお問い合わせ、誤字・脱字等のご指摘は、下記URLにお願い致します。

https://lumber-mill.co.jp/contact.php