1. tanaken on Rails
  2. #009: Security Support, Fixt..
2024-03-03 14:29

#009: Security Support, FixtureSet, query_constraints

サマリー

Ruby on Railsバージョン6.1.7.7、7.0.8.1、7.1.3.2のバージョンがリリースされており、セキュリティ問題に関する修正が含まれています。さらに、アクティブレコードのフィクスチャーセットとクエリーコンストレインツに関する変更が行われています。

00:01
こんにちは、tanakenです。第9回のtanaken on Rails始めていきます。今週のThis Week in Railsから、3つのトピックをピックアップしたので、お話ししていきます。
Ruby on Railsの新バージョンリリース
1つ目、Ruby on Railsバージョン6.1.7.7、7.0.8.1、 そして7.1.3.2のバージョンがリリースされたよというお知らせです。
これらは、セキュリティ問題に関する修正を含むバージョンです。なので、新しいバージョンにアップデートしてねと、そういうお知らせがまず冒頭に出ておりました。
どんどんアップデートして、最新にしていきましょう。
関連して、セキュリティ問題に関する修正ということで、Ruby on Railsのメンテナンスポリシーというのをしっかり把握しておくといいかなと思ってリンクを貼っておきます。
Rails GuideにRuby on Railsのメンテナンスポリシーというタイトルのページがございます。
これを読むと、セキュリティ問題の修正をどのバージョンまでサポートしているのかというのがわかります。
本日の2024年3月3日現在では、7.1系、7.0系、6.1系というのが、この3つがセキュリティサポートの対象となっています。
なので、6.0系以下のバージョンを使っている場合は、セキュリティサポートがされていないので、そもそも6.1系以上に上げましょうと。
さらにそのバージョンの中で、パッチバージョンが最新のものがどんどんセキュリティ修正が入っていくので、新しいものを使っていきましょうねということですね。
続いて2点目、タイトルがExpose a generic fixture accessor for fixture names that may conflict with minitestというリクエストです。
タイトルを違約すると、ミニテストと競合する可能性のあるフィクスチャー名に対して、汎用的なアクセサーを実装しましたというような内容です。
こちらは、アクティブレコードに関する変更です。
アクティブレコードコロンコロンフィクスチャーセットというクラスがあります。
これは、Railsの公式のドキュメントにも説明がありますが、より日本語で分かりやすく翻訳してくださっているテックラッチョの記事で翻訳されたものがあるので、
そちらをまずは前提として紹介します。
このフィクスチャーセットに関して、フィクスチャーとはテストの対象としたいデータ、つまりサンプルデータを組み立てる手法の一つです。
フィクスチャーはYAMLファイルに保存されます。
一つのYAMLファイルが一つのモデルに対応し、
アクティブサポートコロンコロンテストケース.フィクスチャーパスイコール括弧パスで指定されたディレクトリに保存されます。
このディレクトリ自体は、括弧書きで、このディレクトリはRailsで自動設定されますので、
自分のRailsアプリすら、テストすら、フィクスチャーズすらというところに保存できます。
フィクスチャーファイル名の末尾には.YAML拡張子が付きます。
フィクスチャーファイルのフォーマットは次のような感じになります。
という形でサンプルが書かれています。
例えばwebsites.yamlというファイルで、
データのキーとしてRuby on Railsというキー名でID1 name ruby on Rails。
URLがhttp://www.rubyonrails.org。
2個目のデータがGoogleというキーでIDが2番。
ネームが大文字で頭文字大文字のGoogle。
URLがhttp://www.google.comみたいな感じでYAMLファイルを定義できます。
このファイルを使ってテストを実行するときに、
各テストの実行前にすべてのフィクスチャーが自動的にデータベースに読み込まれます。
データの一貫性を保つためにフィクスチャーは読み込みが実行される前に環境によって削除されます。
テストの実行前に前のデータを削除した上で新しくデータを読み込んでテストを実行するという仕組みになってますよという説明があります。
そのフィクスチャーで取り込んだYAMLファイルからデータベースに打ち込んだデータをどういうふうに取ってくるんですかという話があって、
その方法は2つあります。
1つは純粋にモデル名を使う。
これはデータがテーブルに入っているので、
Railsの普段通りですね、モデル名.findとか、
引数にIDを渡してfindとか、
モデルのメソッドは諸々使えますよね、カウントしたりとか、
フェアで何か取ってきたりとか、何でもいいでしょう。
モデル名を使ってデータを取ってくるというのはもちろんできますよ。
2つ目の方法が特殊なメソッドを使うということで、
特殊なメソッドって何ですかというと、
フィクスチャーファイルの名前をメソッドとして呼び出すことができます。
さっきの例でいうと、websites.yamlというフィクスチャーを作ったので、
websitesというメソッドが呼び出せます。
内部実装を見てみると、websitesという風なメソッドが呼ばれたときに、
メソッドミッシングでその名前のyamlファイルがあるかみたいなのを
探してきている感じっぽいですね、実装を見ると。
フィクスチャーファイルの名前がメソッドとして定義されて、
引数にフィクスチャー名というものを渡します。
フィクスチャー名って何なのかというと、
さっき紹介したフィクスチャーファイルの中で、yamlファイルの中で、
キーをRuby on RailsだったりGoogleだったりキーを設定して、
その下にIDとかネームとかURLというのをそれぞれ定義してたんですけど、
その一番上のキーのところがフィクスチャー名という風に呼んでますね。
呼ばれているみたいです、この記事。
でもフィクスチャー名という風に呼んでいるみたいです。
そのキーを指定することで、
そのキーに一致するデータを返してくれるという感じですね。
なのでさっきのWebサイツの例でいうと、
Webサイツメソッドで括弧、
Webサイツメソッドを使って、
フィクスチャーファイルの中で、
なのでさっきのWebサイツの例でいうと、
Webサイツメソッドで括弧、
シンボルでRuby on Railsという形で指定すると、
さっきのネームがRuby Space on Railsか、
だったりURLがwww.rubyonrails.orgのデータが取ってくる。
そんな仕組みがありますということなんですよね。
ここまでが、
Active Recordのフィクスチャーセットに関する説明でした。
今回のプルリクエストで何が変わったのかというと、
この特殊なメソッド、
つまりフィクスチャーファイル名を使ったメソッドを使う場合の問題点の解消をするために
変更が加わっています。
どんな問題点があったのかというと、
ミニテストを使う場合に問題が起こりました。
比較的最近、ミニテストにメタデータという名前のメソッドが追加されました。
最近といっても、2023年7月27日のコミットですね。
なので半年ぐらい、もうちょっと前か。
メタデータという名前のメソッドが追加されたので、
ミニテストを利用していて、かつRailsのこのフィクスチャーセット機能を使って、
メタデータYAMLを利用している場合、
つまりRailsでメタデータモデルがあって、
それに対応するメタデータYAMLというのを定義している場合、
この場合にメタデータというメソッドを使うと競合しちゃうと。
ミニテスト内に実装されたメタデータというのを、
メタデータメソッドを使っちゃうことになりますね。
さっき言った通り、フィクスチャーファイル名のメソッド呼び出しは、
メソッドミッシングで定義と呼ばれているので、
多分先にメタデータメソッドがあったら、
ミニテストの方のメタデータメソッドを使っちゃうかなと思いますね。
そういうメソッドの競合が起きちゃうと。
つまりフィクスチャーセットの方のメタデータメソッドを呼びたいんだけど、
それができないということになっちゃうと。
その問題を回避するために、今回のプールリクエストでは、
明示的にフィクスチャーセットの、つまりYAMLファイルの方の
データを取ってこれるように新しいメソッドを実装しています。
そのメソッド名がフィクスチャーというメソッドですね。
このメソッドは、第1引数にフィクスチャーファイル名、
第2引数にフィクスチャー名、さっき言うところのRuby on Railsとか、
そのキーの名前ですね、ファイル内のキーの名前。
もう一度言うと、フィクスチャー括弧、フィクスチャーファイル名、
第2引数がフィクスチャー名という形で利用できると、
そういうメソッドになっております。
ということですね、フィクスチャーセットを僕は使ったことがなかったので、
今回勉強になりました。
続いて最後、3点目。
クエリーコンストレインツのエラーメッセージ修正
タイトルが、モデル.クエリーコンストレインツ
with single non-primary key column raises incorrect error
というフィックスか、冒頭にフィックスがついてた。
このエラーメッセージ、インコレクトなエラーを修正したというタイトルですね。
こちらもアクティブレコードに関する変更です。
アクティブレコードにクエリーコンストレインツというメソッドがあります。
これは何かというと、セレクト・アップデート・デリートクエリの
フェアアークおよびファーストメソッドとかラストメソッドにおける
オーダーバイクでどのカラムを使うのかというのを指定できます。
このメソッドにカラム名を引数で渡すんですけど
引数を1つだけ指定して、かつその引数がプライマリーじゃないカラム名の場合
エラーが発生するようになっています。
エラーが発生した場合に何らかのエラーメッセージが出るんですけども
そのエラーメッセージが不適切な内容になっていたと
よくわからないエラーメッセージが出た。
エラーにはなるんだけど、よくわからないという感じになっていたので
そのエラーメッセージをわかりやすい内容に変えましたという変更になっています。
具体的な変更内容はプレリクエストに書いてあるので
そちらをご覧くださいという感じですね。
プライマリーなキーを指定してね、1個の場合はプライマリーなキーを指定してね
みたいな感じのメッセージになったよということかな。
というところでございました。
おさらいすると、今回はセキュリティ修正の含む新しいバージョンがリリースされたよというお知らせと
アクティブレコードに関する変更点2点
フィクスチャーセット関連の変更と
クエリーコンストレインズというメソッドに関する変更が行われていましたと
そんなお話でございました。
では第9回のTanaken on Railsを終わりにしたいと思います。
ではまた来週。バイバイ。
14:29

コメント

スクロール