お知らせ
僕が翻訳している電子書籍「Everyday Rails - RSpecによるRailsテスト入門」をアップデートしました🎉
すでに本書を購入されている方はLeanpubのサイトから最新版の電子書籍ファイルを無料でダウンロードできます。
2024年版のアップデート内容
今回のアップデート内容は以下の通りです。
- サンプルアプリケーションをRails 7.1 + Ruby 3.3 + rspec-rails 6.1で再作成
- これに伴い、サンプルアプリのリポジトリURLも変更
- 新しいサンプルアプリのコードや挙動にあわせて、本書の記述を修正
- リンク切れしていたいくつかのリンクを新しいURLに修正
Rails 7.1で作った新しいサンプルアプリケーションは以下のGitHubリポジトリに置いています。
とはいえ、書籍としてはほとんど内容は変わっていません。
Rails 7.0も7.1もRSpecの使い方を学ぶ上では考え方を大きく変えるようなポイントはない、と思ってもらって大丈夫です。
細かすぎて伝わらない変更点
ほとんど同じ、とはいうものの、細かい点では若干変わっています。
その変更点に誰も気付かれないのはちょっと悲しいので、変更点をいくつか紹介します。
「タスク完了」のUIをHotwireを使って実装した
Everyday Railsのサンプルアプリには「タスク完了」のチェックボックスをクリックすると、即DBが更新される機能があります。
Rails 7.1版のサンプルアプリではこの機能をHotwireを使って実装してみました。
letter_opener_webを導入した
サンプルアプリではメールを送信する機能があるのですが、開発環境でメールがちゃんと送信できたのかどうかはRailsのログを確認するぐらいしかありませんでした。
(ただし、テストコード内ではRSpecを使って送信されたメールの内容をテストしています)
Rails 7.1版のサンプルアプリではletter_opener_webを導入しています。
そのため、 http://localhost:3000/letter_opener にアクセスすれば送信されたメールの内容が確認できます。
不要なアップロードファイルを削除するコードが変わった
Rails 7.1ではrails new
したタイミングで、tmp/storage/.keep
というファイルが作成されます。
第10章ではこれまで
config.after(:suite) do FileUtils.rm_rf(ActiveStorage::Blob.service.root) end
というコードで不要なアップロードファイルを削除していました。
ですが、これだとtmp/storage/.keep
も一緒に削除してしまいます。
そこで、以下のコードに変更して不要なディレクトリだけを削除するようにしました。
config.after(:suite) do Pathname(ActiveStorage::Blob.service.root).each_child do |path| path.rmtree if path.directory? end end
Rails 7.1やRuby 3.3では警告が発生する箇所の修正
いくつかのgemではRails 7.1やRuby 3.3で実行すると警告が出るものがあったので、Rails 7.1版のサンプルアプリケーションではやむを得ずGitHubリポジトリ上のgemのコードを参照するなどして警告の発生を回避しています。
これらの回避策はあくまで一時的なものなので、正式対応版がリリースされ次第、元のコードに直す予定です。
Capybara 3.39.2
2024.2.3追記
Capybara 3.40.0がリリースされて下記の問題が解消したため、サンプルアプリも最新のCapybaraを使うようにアップデートしました。
Rack 3を使っているとCapybaraが原因で"Rack::Handler is deprecated and replaced by Rackup::Handler" という警告が発生します。
github.com
すでに修正コードはmasterブランチにマージ済みですが、まだ正式リリースされていないため、GemfileでGitHub上のコードを参照するようにしています。
# Gemfile # Waiting for https://github.com/teamcapybara/capybara/pull/2706 to be released gem "capybara", github: "teamcapybara/capybara"
Geocoder 1.8.2
Ruby 3.3を使っていると、Geocoderが原因で以下のような警告が発生します。
warning: csv was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.4.0. Add csv to your Gemfile or gemspec.
すでに修正コードはmasterブランチにマージ済みですが、まだ正式リリースされていないため、GemfileでGitHub上のコードを参照するようにしています。
# Gemfile # Waiting for https://github.com/alexreisner/geocoder/issues/1642 to be released gem "geocoder", github: "alexreisner/geocoder"
ちなみにgeocoderに修正のプルリクエストを送ったのは僕です。
また、Ruby 3.3で警告が出る理由については以下のQiita記事で説明しています。
Devise 4.9.3
Rails 7.1を使っていると、Deviseが原因で以下のような警告が発生します。
DEPRECATION WARNING: `Rails.application.secrets` is deprecated in favor of `Rails.application.credentials` and will be removed in Rails 7.2.
この問題はIssueとしてすでに報告されていますが、2024年1月9日時点ではまだOpenのままです。
この警告を回避するため、config/initializers/devise.rb
で以下の記述を追加しています。
# config/initializers/devise.rb # NOTE: Please remove the following lines when https://github.com/heartcombo/devise/issues/5644 is fixed require 'devise/version' raise "Issue 5644 might be fixed" unless Devise::VERSION == "4.9.3" config.secret_key = Rails.application.secret_key_base
まとめ
というわけで、このエントリでは「Everyday Rails - RSpecによるRailsテスト入門がRails 7.1とRuby 3.3に対応しましたよ」というお知らせを書いてみました。
Rails 7.0と7.1で変わる部分はほとんどないものの、公式に「Rails 7.1でも本書の内容は有効ですよ!」とアナウンスしてあれば、安心して本書を購入できるんじゃないかなと思います。
また、すでに本書を持っている人も、「変更点がほとんどない=本書で学んだRSpecの知識は最新の開発環境でもまだ有効」ということがわかって安心できるのではないでしょうか?
これからも引き続き最新版のRailsやRSpecに対応していく予定ですので、みなさん今後とも「Everyday Rails - RSpecによるRailsテスト入門」をよろしくお願いします。
(購入済みの方は周りの人にお勧めしてもらえると嬉しいです!😄)
Q. どうやって購入するの?
本書の購入手順は以下のブログ記事で詳しく説明されているので、こちらをご覧ください。
tomoyuki65.com
また、そのほかのよくある質問に関しては以下のエントリにまとめています。
興味がある方はこちらをご覧ください。
blog.jnito.com
あわせて読みたい
「Everyday Rails - RSpecによるRailsテスト入門」も「プロを目指す人のためのRuby入門」も、「出版したら終わり、にしない技術書」を目指しております。