Home Software Libraries Ruby rails rails 7.0.4 で pg 1.5 を使うと警告が出る問題 @wakairo 26 Apr, 2023 05:35 +00:00 Last edited 26 May, 2023 02:53 +00:00 結論 railsのバージョンを7.0.5以上に上げてから、pg 1.5 にバージョンを上げれば、警告の問題は発生しません。 問題が発生したバージョン ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux] rails (7.0.4.3) 問題を引き起こした作業内容 bundle updateでpgのバージョンを1.4系から1.5系に上げた。 発生した問題 rails testで以下のような警告が複数出るようになった。 PG::Coder.new(hash) is deprecated. Please use keyword arguments instead! Called from /usr/local/bundle/gems/activerecord-7.0.4.3/lib/active_record/connection_adapters/postgresql_adapter.rb:980:in `new' rails 7.0.5のリリース後に行った対処 Gemfileにて、pgは1.5以降、railsは7.0.5以降を使うように指定してから、bundle updateコマンドを実行した。 その後でrails testを実行し、前述の警告が出ないことを確認した。 rails 7.0.5のリリース前に行った対処 Gemfileに以下のように記述して、利用するpgを1.4系に留めるように指定した。 gem "pg", "~> 1.4.6" rails本家の対応状況 4/24にissueが立った: https://github.com/rails/rails/issues/48046 4/25に修正がマージされた: https://github.com/rails/rails/pull/48048 5/25に修正が入ったv7.0.5がリリースされた: https://github.com/rails/rails/releases/tag/v7.0.5
Home Software Libraries Ruby bundler bundleコマンドの公式マニュアル @wakairo 25 Apr, 2023 06:27 +00:00 Last edited 25 Apr, 2023 06:28 +00:00 bundleコマンドの公式マニュアルは、公式サイトから、 Docs > Reference Guidesで辿ることができる。 例えば、bundle updateのマニュアルはこちら。こちらでは、利用できるオプションについてもきちんと説明されています。 ちなみに、Google検索からでは、なぜか公式マニュアルにたどり着きにくい気がするので、このTopicを立てました。
Home Software Libraries Ruby rails Railsを用いた運用中のサービスのアップグレードの仕方 @wakairo 18 Apr, 2023 02:29 +00:00 Last edited 25 Apr, 2023 04:14 +00:00 まずはRubyをアップグレード 「RubyのアップグレードとRailsのアップグレードは別々に行うのがよい方法です。最初にRubyを可能な限り最新版にアップグレードし、それからRailsをアップグレードします。」 Railsガイドより 次にRailsを1つずつアップグレード 「Railsのバージョンを変更する場合、マイナーバージョンを1つずつゆっくりと上げながら、その都度表示される非推奨機能の警告メッセージを上手に利用するのがベストです。」Railsガイドより 具体的には、以下の手順を繰り返す。 テストを書き、テストがパスすることを確認する。 現時点のバージョンのパッチバージョンを最新のパッチに移行する。 テストを修正し、非推奨の機能を修正する。 次のマイナーバージョンの最新パッチに移行する。 マイナーバージョン以上を上げる場合、Gemfileに記載されているRailsのバージョンを更新した後にbin/rails app:updateを実行して設定等を最新のバージョンに合わせる。参考:1.4 アップデートタスク、1.5 フレームワークのデフォルトを設定する
Home Software Libraries Ruby rails ファイル名とクラス名の対応関係などが命名規則に従っているかのチェック方法 @wakairo 08 Feb, 2023 12:51 +00:00 Last edited 08 Feb, 2023 12:52 +00:00 Railsでは、自動で定数の読み込みと再読み込みが行われます。 この自動システムをきちんと動作させるには、ファイルパス・ファイル名とモジュール構造・クラス名を命名規則に従って対応させる必要があります。 Railsガイドによれば、 以下のコマンドを実行することでこの命名規則に従っているかの確認を行えます。 bin/rails zeitwerk:check このコマンドの実行結果の末尾に「All is good!」が表示されれば命名規則は守られています。
Home Software Libraries Ruby zeitwerk Rails7以降はZeitwerkに完全移行 @wakairo 08 Feb, 2023 02:13 +00:00 Rails 6でZeitwerkが導入され、Rails 7でclassicと呼ばれる旧来のオートローダーは廃止されました。 以下は、 https://railsguides.jp/classic_to_zeitwerk_howto.html からの引用です。 Railsは最初期からRails 5まで、Active Supportで実装されたオートローダーを用いていました。このオートローダーはclassicと呼ばれ、Rails 6.xでは引き続き利用可能です。classicオートローダーはRails 7で廃止されました。 Rails 6から、より優れた新しいオートロード方法がRailsに搭載されました。これはZeitwerkというgemに一任されています。これがzeitwerkモードです。デフォルトでは、Railsフレームワーク6.0および6.1の読み込みはzeitwerkモードで実行され、Rails 7で利用できるのはzeitwerkモードのみとなります。
Home Software Libraries Ruby actionpack redirect_backよりもredirect_back_or_toを使った方が良さそう @wakairo 06 Feb, 2023 14:33 +00:00 以下のコードから分かるとおり、redirect_backはredirect_back_or_toをラップしているだけです。 https://github.com/rails/rails/blob/v7.0.4/actionpack/lib/action_controller/metal/redirecting.rb#L96 普通はfallback_locationを指定する必要があるはずですので、第1引数にfallback_locationを指定してredirect_back_or_toを呼び出した方が素直のように思います。
Home Software Libraries Ruby activerecord unscopeはscope系以外の条件も外す @wakairo 06 Feb, 2023 01:42 +00:00 Last edited 06 Feb, 2023 02:03 +00:00 RailsのActive Recordには、scopeやdefault_scopeという機能があり、SQLクエリの条件を指定してあらかじめ付けておくことが可能です。 unscopeやunscopedは、これらのscope系で付けた条件を外すことが出来ます。 ただ、注意点として、scope系以外で付けた条件も外してしまいます。 以下に例を示します。 irb(main):001:0> puts User.where(id: 1).all.to_sql SELECT "users".* FROM "users" WHERE "users"."id" = 1 => nil irb(main):002:0> puts User.where(id: 1).unscope(:where).all.to_sql SELECT "users".* FROM "users" => nil irb(main):003:0> puts User.where(id: 1).unscoped.all.to_sql SELECT "users".* FROM "users" => nil unscopeやunscopedが、直前のwhere句で指定した条件を外していることが確認できます。 確認した環境 Rails 7.0.4 参考 Railsガイド:Active Record クエリインターフェイス:9 条件を上書きする
rails 7.0.4 で pg 1.5 を使うと警告が出る問題
結論
railsのバージョンを7.0.5以上に上げてから、pg 1.5 にバージョンを上げれば、警告の問題は発生しません。
問題が発生したバージョン
問題を引き起こした作業内容
bundle update
でpgのバージョンを1.4系から1.5系に上げた。発生した問題
rails test
で以下のような警告が複数出るようになった。rails 7.0.5のリリース後に行った対処
Gemfile
にて、pgは1.5以降、railsは7.0.5以降を使うように指定してから、bundle update
コマンドを実行した。その後で
rails test
を実行し、前述の警告が出ないことを確認した。rails 7.0.5のリリース前に行った対処
Gemfile
に以下のように記述して、利用するpgを1.4系に留めるように指定した。rails本家の対応状況
bundleコマンドの公式マニュアル
bundleコマンドの公式マニュアルは、公式サイトから、
Docs > Reference Guides
で辿ることができる。例えば、bundle updateのマニュアルはこちら。こちらでは、利用できるオプションについてもきちんと説明されています。
ちなみに、Google検索からでは、なぜか公式マニュアルにたどり着きにくい気がするので、このTopicを立てました。
Railsを用いた運用中のサービスのアップグレードの仕方
まずはRubyをアップグレード
「RubyのアップグレードとRailsのアップグレードは別々に行うのがよい方法です。最初にRubyを可能な限り最新版にアップグレードし、それからRailsをアップグレードします。」 Railsガイドより
次にRailsを1つずつアップグレード
「Railsのバージョンを変更する場合、マイナーバージョンを1つずつゆっくりと上げながら、その都度表示される非推奨機能の警告メッセージを上手に利用するのがベストです。」Railsガイドより
具体的には、以下の手順を繰り返す。
bin/rails app:update
を実行して設定等を最新のバージョンに合わせる。参考:1.4 アップデートタスク、1.5 フレームワークのデフォルトを設定するファイル名とクラス名の対応関係などが命名規則に従っているかのチェック方法
Railsでは、自動で定数の読み込みと再読み込みが行われます。 この自動システムをきちんと動作させるには、ファイルパス・ファイル名とモジュール構造・クラス名を命名規則に従って対応させる必要があります。
Railsガイドによれば、 以下のコマンドを実行することでこの命名規則に従っているかの確認を行えます。
このコマンドの実行結果の末尾に「All is good!」が表示されれば命名規則は守られています。
Rails7以降はZeitwerkに完全移行
Rails 6でZeitwerkが導入され、Rails 7でclassicと呼ばれる旧来のオートローダーは廃止されました。
以下は、 https://railsguides.jp/classic_to_zeitwerk_howto.html からの引用です。
redirect_backよりもredirect_back_or_toを使った方が良さそう
以下のコードから分かるとおり、
redirect_back
はredirect_back_or_to
をラップしているだけです。https://github.com/rails/rails/blob/v7.0.4/actionpack/lib/action_controller/metal/redirecting.rb#L96
普通は
fallback_location
を指定する必要があるはずですので、第1引数にfallback_location
を指定してredirect_back_or_to
を呼び出した方が素直のように思います。unscopeはscope系以外の条件も外す
RailsのActive Recordには、
scope
やdefault_scope
という機能があり、SQLクエリの条件を指定してあらかじめ付けておくことが可能です。unscope
やunscoped
は、これらのscope系で付けた条件を外すことが出来ます。ただ、注意点として、scope系以外で付けた条件も外してしまいます。
以下に例を示します。
unscope
やunscoped
が、直前のwhere
句で指定した条件を外していることが確認できます。確認した環境
参考