Better error message, opt-in devcontainers and more! | This Week in Rails
https://world.hey.com/this.week.in.rails/better-error-message-opt-in-devcontainers-and-more-b9582451
Raise a descriptive error when a Store column is misconfigured by flavorjones · Pull Request #51898 · rails/rails · GitHub
ActiveRecordに関する変更です
前提として ActiveRecord::Store について紹介します
Storeはデータベースの単一のカラムにハッシュとして複数の属性を保存するために使用されます
次にような例です
code:rb
class User < ApplicationRecord
store :settings, accessors: :color, :homepage , coder: JSON
end
この例では、settingsカラムはJSON形式で保存され、colorとhomepageという2つの仮想属性が作成されます
これらの属性は、通常のモデル属性と同様に扱うことができます
code:rb
user = User.new(color: "blue", homepage: "https://example.com")
user.color # => "blue"
user.homepage # => "https://example.com"
また、これらの仮想属性は、ActiveRecordのバリデーションやコールバックにも対応しています
ただし、Storeで定義した仮想属性については次のような注意事項があります
データベースのスキーマには存在しないため、直接的なデータベースのクエリは行えません
大量のデータを保存する場合や頻繁に更新が行われる場合は、パフォーマンスに影響を及ぼす可能性があります
また store_accessor メソッドを使用すると、定義済みのstoreに対して属性を追加できます
code:rb
class SuperUser < User
store_accessor :settings, :privileges
end
今回のプルリクエストでは、この store_accessor メソッドを使用する場合のエラーメッセージが修正されています
具体的には、まだ定義されていないstoreに対して store_accessor メソッドで属性を追加し、その属性を参照しようとしたときのエラーメッセージです
修正前はNoMethodErrorになっていました
NoMethodError: undefined method `accessor' for an instance of ActiveRecord::Type::Text
修正後はActiveRecord::ConfigurationErrorになります
ActiveRecord::ConfigurationError: the column 'settings' has not been configured as a store.
Don’t configure Kamal storage volume if not needed by jeromedalbert · Pull Request #51838 · rails/rails · GitHub
Railtiesに関する変更です
前回のエピソードでKamalというアプリケーションデプロイツールについて紹介しました
railsアプリケーションを rails new コマンドで生成する際に、Kamalの設定ファイルとしてconfig/deploy.yml が生成されます
今回のプルリクエストではこのdeploy.ymlに関する修正が行なわれています
このyamlには様々な設定が記載されていますが、そのなかにActiveStorageを利用する場合の設定も記載されています
この記載はActiveStorageを利用しないアプリケーションにおいては不要な記載ですが、生成時に常に記載されるようになっていました
そこで、今回のプルリクエストでは --skip-active-storage を指定してrails newした場合には、この記載をしないようにする、という修正が行なわれています
Add rubocop and GitHub Actions to plugin generator by excid3 · Pull Request #51822 · rails/rails · GitHub
Railtiesに関する変更です
Railsにはプラグインを作成する機能(プラグインジェネレーター)があります
Rails プラグイン作成入門 - Railsガイド
rails plugin new というコマンドでプラグインを作成できます
今回のプルリクエストではこのコマンドを実行したときに、次のファイルが生成されるようにしています
.github/workflows/ci.yml
プルリクエストの作成およびmainブランチへのpushをトリガーとして、rubocopでのlintとテストの実行をする
.rubocop.yml
ci.ymlでrubocopを実行する際の設定ファイル
.github/dependabot.yml
dependabotの設定ファイル
オプション --skip-rubocop --skip-ci を指定することでスキップできるようになっています