Rails のプロジェクト作成方法まとめ (Ubuntu 22.04)

Railsプロジェクトの作り方を忘れてしまいがちなので、復習として記事にしておきます。

# 環境
- Ubuntu 22.04
- rbenv インストール済み
- ruby-build インストール済み

インストール方法はこちらに記載してあります。インストールしていない方は事前にインストールしてください。

https://qiita.com/yuinore/items/3545c32bb69253b8c0e6#ruby-rbenv-bundler

```
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="~/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
rbenv -v
 
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
sudo apt install -y build-essential libssl-dev zlib1g-dev
rbenv install --list
rbenv install 3.2.1
rbenv global 3.2.1
ruby -v

gem update
gem install bundler
bundle -v
```

# Ruby のインストール

Ruby の最新安定バージョンが 3.2.1 なので今回はそれを使いましょう。.ruby-version ファイルを作成して使いたいバージョンを書き込みます。Ruby の最新バージョンは https://www.ruby-lang.org/ja/downloads/ で確認できます。

```:.ruby-version
3.2.1
```

```bash
$ rbenv version
rbenv: version '3.2.1' is not installed (set by /path/to/repository/.ruby-version)
$ rbenv install # 必要なバージョンがインストールされていない場合はこちらを実行
$ rbenv version
3.2.1 (set by /path/to/repository/.ruby-version)
```

# Rails のインストール

グローバルに rails がインストールされていない想定で、Gemfile を書いて rails コマンドを使えるようにしましょう。

```bash
$ bundle init
```

`# gem "rails"` のコメントアウトを外します。
バージョンを指定しなければ最新バージョンがインストールされるので、バージョン指定はなくても大丈夫です。

```:Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

gem "rails"
```

備考：バージョン指定する場合は `gem "rails", "~> 6.0.1"` のように記載してください。このようにすると、`6.0.x` まではアップデートできるようになります。

https://qiita.com/homhom_star/items/0a401a1075060fe2de4b

Gemfile を更新したら `bundle install` を実行すると、rails コマンドが使えるようになります。

```bash
$ bundle install
```

備考：`--path vendor/bundle` オプションは付けても付けなくても大丈夫です。付ける場合は後で `.gitignore` に `vendor/bundle` を追加するのを忘れないようにしましょう。

https://qiita.com/jnchito/items/99b1dbea1767a5095d85

# Rails リポジトリの初期化

`rails new` を実行します。Gemfile は Y を押して上書きしてしまって大丈夫です。webpack を使うかどうかなどをオプションで設定できます。

```bash
$ bundle exec rails new . -B -d mysql --skip-turbolinks --skip-test --skip-git
       exist  
      create  README.md
      create  Rakefile
   identical  .ruby-version
      create  config.ru
    conflict  Gemfile
Overwrite /path/to/repository/Gemfile? (enter "h" for help) [Ynaqdhm] Y

......（以下省略）
```

バージョンを指定する場合は以下のようにします。

```bash
$ bundle exec rails new _6.0.1_ . -B -d mysql --skip-turbolinks --skip-test --skip-git
```

備考：オプションはこちらを参考にしました。

https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26

もし `--skip-git` を指定しなかった場合はブランチが `main` に変わってしまうので、元のブランチを checkout します。

```bash
$ git checkout master
```

代わりに `--skip-git` を指定すると `.gitignore` が作成されないようです。それでは困るので用意しましょう。

```:.gitignore
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
#
# If you find yourself ignoring temporary files generated by your text editor
# or operating system, you probably want to add a global ignore instead:
#   git config --global core.excludesfile '~/.gitignore_global'

# Ignore bundler config.
/.bundle
/vendor/bundle

# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep

# Ignore pidfiles, but keep the directory.
/tmp/pids/*
!/tmp/pids/
!/tmp/pids/.keep

# Ignore uploaded files in development.
/storage/*
!/storage/.keep
/tmp/storage/*
!/tmp/storage/
!/tmp/storage/.keep

/public/assets

# Ignore master key for decrypting credentials and more.
/config/master.key

```

Rails の最新バージョンがインストールされていることを確認しましょう。

```bash
$ cat Gemfile | grep '"rails"'
# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem "rails", "~> 7.0.4", ">= 7.0.4.2"
```

`.gitignore` に `vendor/bundle` を追加する場合はこのタイミングで行います。

Rails の依存パッケージをインストールします。

```bash
$ bundle install
```

# DBの初期化と起動

パスワードは空でも良いのですが、最近のUbuntuではmysqlに空のパスワードを設定することを許可してくれないので、今回はデータベースのパスワードを設定しましょう。`.env` にパスワードを記載して、環境ごとに読み込めるようにします。

```:Gemfile
gem 'dotenv-rails'
```

```bash
$ bundle install
```

```bash:.env
MY_APP_DATABASE_PASSWORD='<ここにmysqlのrootパスワードを記載>'
```

```bash:.env.sample
MY_APP_DATABASE_PASSWORD=
```

```yaml:config/database.yml
default: &default
  password: "<%= ENV.fetch("MY_APP_DATABASE_PASSWORD") { "" } %>"
```

```bash:.gitignore
.env
```

参考：

https://qiita.com/rarrrrsQ/items/1b1277499819659e5601

```bash
$ bundle exec rails db:create
$ bundle exec rails db:migrate
```

ここで `db/schema.rb` が作成されます。

```bash
$ bundle exec rails server
```

`http://localhost:3000` にアクセスできるか確認しましょう。
（URL が https になっていてアクセスできない場合があるようなので注意）

# slim のインストール

```:Gemfile
gem 'slim-rails'
gem 'html2slim'
```

```bash
$ bundle install

# erb を slim に変換して erb を削除
$ bundle exec erb2slim app/views/ app/views/ --delete --trace
```

https://qiita.com/hmuronaka/items/f0e4da231ce97da49043

補足：`undefined method 'exists?' for File:Class (NoMethodError)` というエラーが出た場合は、 File.exist? に書き換える。

```bash
$ bundle exec erb2slim app/views/ app/views/ --delete --trace
bundler: failed to load command: erb2slim (/home/yuinore/.rbenv/versions/3.2.1/bin/erb2slim)
/home/yuinore/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/html2slim-0.2.0/lib/html2slim/converter.rb:17:in `initialize': undefined method `exists?' for File:Class (NoMethodError)

      erb = File.exists?(file) ? open(file).read : file
                ^^^^^^^^
Did you mean?  exist?

```

```diff:vendor/bundle/ruby/3.2.0/gems/html2slim-0.2.0/lib/html2slim/converter.rb
-       erb = File.exists?(file) ? open(file).read : file
+       erb = File.exist?(file) ? open(file).read : file
```

最近修正がマージされたようなのでしばらくしたら rubygems にも降ってくると思います。

https://github.com/slim-template/html2slim/pull/43

# rubocop のインストール

```:Gemfile
group :development do
  gem 'rubocop', require: false
  gem 'rubocop-performance', require: false
  gem 'rubocop-rails', require: false
end
```

`.rubocop.yml` を作成します。

```:.rubocop.yml
require:
  - rubocop-performance
  - rubocop-rails

AllCops:
  NewCops: enable

Style/Documentation:
  Enabled: false
```

```
$ bundle install
$ bundle exec rubocop --autocorrect
$ bundle exec rubocop --autocorrect-all
```

https://qiita.com/yoshi_4/items/ba67b5013eeabcc97d63

https://blog.to-ko-s.com/rubocop-setting/

# annotate のインストール

annotate を使うとスキーマ情報をモデルに書き出してくれます。

```:Gemfile
group :development do
  gem 'annotate'
end
```

```bash
$ bundle install
$ bundle exec rails g annotate:install
$ bundle exec rails db:migrate
```