新しいRails 8アプリを作ろう!オススメGem
新しいRails 8アプリを作ろう!
時間管理のアプリほしい! なぜか既存のものが全部使えない、という設定にしましょう。 (TDD、テスト駆動開発について書きたいのが主な理由です)
Ruby on Railsでプロジェクトを始めよう! 使うのは最新のRails 8です。
$ gem install rails
コマンドを実行して、ローカルにRailsをインストールしているのが前提になります。 もちろんその前にもRubyをインストールする必要があります。今回はRuby 3.4を使います。
今回はJavaScriptなしでリアルタイムに動くアプリを作りたいので、Turboを導入することにします。 いわゆるHotwireになります。Rails 7以降はTurbo/Stimulusが標準で入っているので、特別な設定は不要です。
覚えられないほどオプションがあるので、rails new --helpを実行してみましょう。
今回使いたいオプションを以下にまとめています。
rails newのオプション
Tailwind
まず、CSSはTailwindを使いたいです。 これでTailwindにスタイルを任せて、手動でCSSを書くことをほぼなくすことができます。
こちらのオプションは--css=tailwindです。
Javascript
JSはデフォルトでimportmapになっていて、それで問題ないので、 指定しなくて大丈夫です。Webpack、Sprocketsから開放されます!
asset-pipeline(Rails 8ではデフォルトがPropshaft)
以前はアセットパイプラインというとSprocketsの話でしたが、Rails 8ではPropshaftがデフォルトになりました。
Sprocketsのようにトランスパイルやミニファイをせず、ただ配信するだけのシンプルな作りで、速いです。
なので--asset-pipeline=propshaftを明示的に付ける必要はもうありません。
Solid Queue / Solid Cache / Solid Cable(Rails 8の新デフォルト)
Rails 8からはジョブキュー・キャッシュ・WebSocketのバックエンドがすべてDB(SQLite/PostgreSQL)ベースの
solid_queue / solid_cache / solid_cableになりました。以前のようにRedisを別で立てなくても、
最初からバックグラウンドジョブやキャッシュが動きます。小〜中規模ならこれで十分です。
main
--mainというオプションでRailsをバージョン指定ではなく、GitHubのメインブランチを使うようにできます。
Shopifyなど、イケてる会社がやっているやり方です。
Gemが対応していない、ということもよくあるので、初心者はこのオプションなしが安全
--skip-jbuilder
jsonを返すことは今の所考えていないので不要です。
database
DBはPostgreSQLを使います。
オプションは--database=postgresqlです。
(ちなみにRails 8ではSQLiteの本番運用も現実的になったので、小規模なら--database=sqlite3も選択肢です)
全部合わせて
以下のコマンドになります!
$ rails new worktimerr --database=postgresql --css=tailwind --skip-jbuilder
Propshaftもimportmapもデフォルトになったので、Rails 7の頃より指定するオプションが減りましたね。
これで開発に当たれますね! と思っていたら、RSpec、RuboCopの設定など、作成したあとにやらないといけないこともまだ残っています。
Rubyのバージョンが古かった!
無事作成したら、Rubyのバージョンが古いことに気づいて、
git -C ~/.rbenv/plugins/ruby-build pull
というコマンドでrbenvに最新のバージョンの情報を読み込まないといけなかったです。
(rbenvではなくmiseを使っている場合はmise self-updateとmise ls-remote rubyで確認できます)
これでrbenv install 3.4.1で最新のRubyをインストールして、
rbenv global 3.4.1で最新のRubyをデフォルトにしています。
.ruby-versionには古いバージョンが記載されていますので、3.4.1に書き換えます。
Gemfileにもruby "古いバージョン"と書いてあるので、上と合わせて、ruby "3.4.1"に書き換えます。
再度bundle実行して、今日の作業は終わりです!