rails newとは?
rails newとは、
文字通り、新しいrailsアプリケーションを作成するコマンドです。
rails new | Railsドキュメント (railsdoc.com)
本記事では、Dockerを使うので、
ローカル環境にrailsをインストールしませんが、
Dockerを使わない場合は、
railsをインストールしないと、
上記のコマンドは使えません。
個人開発であれば、
rails newする機会はたくさんあると思いますが、
実務だと、rails newコマンドは、
新規開発プロジェクトの立ち上げになりますので、
一定レベルのエンジニアかつ立ち位置でないと触れる機会が少ないコマンドです。
その点、ある意味伝説のコマンドです(笑)
ちなみに、私は新入社員チームの発表会のようなときに、
リーダーとして、rails newした経験がありますが、
これも正確には、実務ではないので、
私も実務でrails newした経験はまだありません。
若干脱線しましたが、
rails newコマンドには、
ドキュメントに記載があるように、
オプションが色々あり、
DBの指定や、apiモードの指定など、
rails newの時点で行えます。
PostgreSQLを使う場合(サンプルコマンド)
rails new <appname> -d postgresql
-dオプションでDBを指定します。
デフォルトでは、sqlite3が使われますが、
実務ではほとんど使わないので、
実質上のデフォルトは、postgresqlと言っても過言ではありません。
もういい加減、
sqliteをデフォルトにするのやめませんか?って
思いますが、何か理由があるんでしょうかね。
他に有名なDBとしては、
mysqlなどもありますが、
どういうわけか、Rails界隈では、
postgresqlが人気があるので、
mysqlが採用されているケースは、
postgresqlよりは少ない印象です。
(ないわけではありません)
さて、書式については、
-database=DATABASEという書式でも同様です。
ちなみに、特定のバージョンのrailsでrails newしたい場合は、
rails _6.1.4_ new <appname>
とすることで実行できます。
上記だと、6.1.4のrailsがインストールされます。
Railsは、5系、6系、7系で、
微妙に挙動が違ったりするので、
上記のようにバージョン指定でインストールする場面もあるかもしれません。
Ruby on Railsのドキュメント
ちなみに、Ruby on Railsでよく参照するドキュメントは、
上記のRailsドキュメントや、Rails ガイドが多いです。
いや、それにしてもRailsの場合、
日本語で公式ドキュメントが読むことができるのが素晴らしいですね。
これに慣れすぎると、
英語のドキュメントが読めなくなってしまいます。(震え声)
一応、Railsにも英語のドキュメントがあり、
稀ですが、上記の2つのドキュメントには記載がない、
メソッドなどについて、調べたいときに参照したりします。
強強エンジニアに、Railsについて、
質問すると、一定の確率で、
上記の英語のドキュメントが返ってきます(笑)
あと、Railsは普通にGithubにもコードがあるので、
ドキュメントどころか、コードを読めって言ってくる仙人エンジニアもいます。
https://github.com/rails/rails
最初のうちは、
私が推奨した、日本語の2つのドキュメントだけ参照する形でも
十分かと思います。
というか、上記の日本語の2つのドキュメントすら読まずに、
rails触っているエンジニアも、多いのが現状なので、
上の2つをしっかり読むだけで、意外と平均以上行ける気がします...
(真偽はわかりません)
いずれにしろ、Ruby on Railsは、
公式ドキュメントがしっかりしているので、
この点は大きな魅力ですね。
Docker環境でrails new
いよいよ、環境構築に入ります。
ローカルでrails newしてもいいのですが、
その場合、rbenvとかrailsとかインストールするものが、
多くなり、環境構築が煩雑になりがちです。
(加えてM1だとエラーが起こりがち)
railsはM1とかだと上手く動かなかったりするので、
Dockerでrails newを行います。
まずはDockerfileを作成します。
FROM ruby:3.0-alpine
RUN apk update && \
apk upgrade && \
apk add --no-cache gcompat && \
apk add --no-cache linux-headers libxml2-dev make gcc libc-dev nodejs tzdata postgresql-dev postgresql git bash && \
apk add --virtual build-packages --no-cache build-base curl-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
RUN apk del build-packages
ADD . /myapp
EXPOSE 4000
CMD ["rails", "server", "-b", "0.0.0.0"]
ドキュメントの内容を参考に修正しました。
https://docs.docker.jp/compose/rails.html
alpine系のイメージを使ったのと、apk add --no-cache gcompat && \
の部分は、
m1macに必要なので、入れております。
M1以外の人は、
省略して大丈夫です。
上記のDockerfileの大まかな処理内容としては、
必要なライブラリのインストールを行い、
GemfileとGemfile.lockをコンテナのディレクトリ内にコピーし、
bundle installコマンドを実行している感じです。
bundle installは、
railsで使うコマンドで、
必要なライブラリ(gem)をインストールするコマンドです。
あとは、rails serverという、
ローカルサーバーを立ち上げるコマンドをCMDに設定しています。
なお、Dockerの基本知識に不安がある人は、
下記の記事もご参考ください。
-
参考Dockerとは何か?概要を完全解説 簡単なWebサーバー構築で基礎を学ぶ
Dockerとは? Dockerは、コンテナ型仮想環境を作成するソフトウェアの一種で、隔離された実行環境を用意することが特徴です。 https://aws.amazon.com/jp/docker/ ...
続きを見る
GemfileとGemfile.lock
Dockerfileを記述したので、
次にGemfileを記載します。
rails7系にしたいので、
source 'https://rubygems.org'
gem 'rails', '~>7.0.3'
のようにします。
Gemfileのバージョンの記法ですが、
いくつかパターンがありまして、
上記の ~>のような場合だと、
7.0.3以上、7.1未満というように、
最終桁が繰り上がった数値未満という感じになります。
なので、
gem 'rails', '>=7.0.3', '<7.1'
と記載しても同じ意味になります。
Gemfileのバージョン指定の記法については、
ドキュメントとかのわかりやすい箇所に載っていないので、
混乱しがちですが、下記記事がわかりやすかったです。
https://autovice.jp/articles/118
ちなみに、Gemについては、
下記のようなGemの一覧サイトのようなものがあり、
バージョンを指定するのがよく分からなければ、
下記のサイトのサンプルコードをそのまま貼り付けるというやり方でも、
最初のうちは意外となんとかなります。
あと、そもそもバージョンを指定しないで、
インストールすることもできます。(推奨ではありませんが)
railsもgemの一種ですが、
railsのようにversionによって、
センシティブに挙動が変わるgemは、
バージョン指定にナーバスになるべきですが、
それ以外のgemとかだと、意外と、
バージョン指定なしで運用されていることもあります。
なので、最初のうちは、
そこまで神経質にならなくて大丈夫です。
さてGemfileがそんな感じでして、
次に、空のGemfile.lockも作成します。
Gemfile.lockは、JavaScriptにおける、
yarn.lockのようなインストールされているライブラリのバージョンを管理するファイルです。
基本的に手動では編集しません。
bundle installでインストールされると、
自動的に書き換えられます。
touch Gemfile.lock
docker-compose.yml作成とbuild
最後にdocker-compose.ymlを作成します。
version: '3.9'
services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: password
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 4000 -b '0.0.0.0'"
stdin_open: true
tty: true
volumes:
- .:/myapp
ports:
- "4000:4000"
depends_on:
- db
これは、公式ドキュメントを参考にしている部分が多いです。
https://docs.docker.jp/compose/rails.html
ここまで来たら、
いよいよrails newします。
docker-compose run web rails new . --force --database=postgresql
新しいGemfileが作成されるので、
buildします。
docker compose build
これで雛形ができますが、
DBの設定がまだなので、
そちらを行います。
database.ymlの設定とコンテナ立ち上げ
下記はrailsプロジェクト配下の
config/database.ymlというファイルです。
defaultで設定されている部分に、
DBのusernameやpasswordなどといったことを設定します。
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password: password
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
最後にコンテナを立ち上げます。
docker compose up -d
ただおそらく、これで、
localhost:4000にアクセスしても、
ActiveRecord::NoDatabaseErrorというエラーが出るかなと思います。
そのまんまのエラーなので、
DBを作成します。
docker-compose run web rails db:create
このあとは、出ない場合もありますが、
もし、pending migration errorというのが出たら、
docker-compose run web rails db:migrate
で治るかなと思います。