$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Docker・MySQL・RuboCop・RSpec・factory_botを導入したRailsプロジェクトを作る

Rails勉強し直している - DB操作編 - $shibayu36->blog; の初期セットアップ部分で言及したとおり、Rails・Docker・MySQL・RuboCop・RSpec・factory_botという構成でやってみた。その構成を初期セットアップする方法についてブログ記事に残しておく。

作ったプロジェクトは https://github.com/shibayu36/rails-project に公開している。

Railsプロジェクトの作成

rails newを使って作成する。databaseをMySQLに指定する。テストは後でセットアップするため--skip-testする。それ以外もひとまず不要そうなものは除外する。

rails new rails_project --skip-test --database=mysql --skip-action-mailer --skip-action-mailbox --skip-action-text --skip-active-storage --skip-action-cable

RSpecの導入

以下をGemfileに入れ

group :development, :test do
  gem "rspec-rails"
end

bundle installとrspec:installを実行。

bundle install
bin/rails generate rspec:install

Dockerの導入

導入がちょっと複雑なので、e2d7b7bd のcommitを見ると早い。ポイントとしては

  • 環境変数でDBアクセスの設定をできるようにする
  • named volumesを使えば簡単にMySQLのデータを永続化できる
  • pidファイルのハンドリングをしないと2回目以降立ち上がらなくなってしまう
  • MySQLの接続ホストをlocalhostにすると、port指定してもmysql.sockを見てしまうので、127.0.0.1を明示的に指定する

RuboCopの導入

Gemfileに

group :development do
  gem 'rubocop', require: false
  gem 'rubocop-rails', require: false
  gem 'rubocop-rspec', require: false
bundle install

後は.rubocop.ymlに以下のような設定をし、自分でカスタマイズしていく。

require:
  - rubocop-rails
  - rubocop-rspec

AllCops:
  Exclude:
    - "vendor/**/*"
    - "db/**/*"
    - "config/**/*"
    - "bin/*"
    - "node_modules/**/*"
    - "Gemfile"
  NewCops: disable

factory_botの導入

先にmodelを作っておく。

bin/rails generate model User name:string:uniq

Gemfileに追加し、bundle install。

group :development, :test do
  gem "factory_bot_rails"

後はfactory_botのための定義をしていくとよい。851ad8 のcommitを参考。ポイントとしては

  • spec/support/以下を自動で読み込む設定を入れた
  • spec/support/factory_bot.rb でFactoryBot::Syntax::Methodsをincludeすることで、namespace指定なしでcreate(:user)とかできるようにした
  • factory定義ではsequenceを使うことで、同一の名前をつけないように

まとめ

以上でDocker・MySQL・RuboCop・RSpec・factory_botを導入したRailsプロジェクトを作ることができた。今後Railsプロジェクトを作るときの参考にしたい。