1. tanaken on Rails
  2. #033: deferred routes drawin..
2024-08-18 10:41

#033: deferred routes drawing, enable_extension, escape_html_entities

Summary

エピソードでは、Railsのプレリクエストに関する3つの重要な変更点が取り上げられています。これには、deferred routes drawing、enable_extension、escape_html_entitiesの各機能改善が含まれています。また、deferred routes drawing、enable_extension、escape_html_entitiesの3つのプルリクエストについて詳しく解説されています。

プレリクエストの概要
第33回のTanaken on Railsです。
This Week in Railsから、3つのプレリクエストをピックアップして紹介します。
1つ目、deferred routes drawing to the first request or when URL helpers called。
レール対応に関する変更です。
第23回で紹介した内容についての再チャレンジを行ったというプレリクエストですね。
詳しくは第23回を聞いてほしいんですけれども、
簡単に説明すると、ルーティングを描画するとき、
最初のリクエストまたはURLヘルパーズが呼ばれるまでは遅延するという仕組みが実装されたんですよね。
大量のルーティングがある場合とかに、
例えばテストとか、最初に全部のルーティングを用意する必要はないよね、
必要なときに用意すればいいよね、というので、
高速化を図ったというような内容だったと思います。
実はこの実装は何度もトライされていて、
5月の半ば頃に最初のプレリクエストが出て、
2週間後ぐらいにいくつか問題があるんだけどという感じで指摘され、
6月の上旬に直しましたという感じで、
2回目のプレリクが出ていて、
これに関してもまた新たな問題が発覚してリバートをしていて、
最後、改めて今回8月の頭ですね。
8月9日に作られたプレリクエストでマージされたというところですね。
こうやって何度もやり取りをしながら、
こういった機能の改善が動いているんだなというのが見れて面白いですね。
アクティブレコードの変更
続いて2つ目。
Enable extension in schema dump doesn't contain schema name。
アクティブレコードに関する変更です。
PostgreSQLで拡張機能を有効化した場合のスキーマダンプに関する修正をしています。
例えば、実行するマイグレーションファイルが、
例えば、Enable extensionみたいなマイグレーションファイルがあるとして、
中身がチェンジメソッドの中で、
Create schemaで引数がMySchema、MySchemaという名前のスキーマを作りますよと、
Enable extensionメソッドで引数にMySchema.postgisというのをマイグレーションファイルを書きましたと。
このマイグレーションファイルを実行すると、もちろん、
スキーマRBに差分が出るんですけども、
その内容がこのプレリクエストの修正前は、
Enable extension postgisという出力になっていたと。
もともとはMySchema.postgisという感じでやってたんだけど、
修正前のスキーマダンプは、
MySchemaというスキーマ名のスキーマ名ドットの部分が消えちゃってると。
修正後はちゃんとMySchema.postgisというところがダンプに出力されるようになってるよと。
そんな感じですね。
スキーマダンプにちゃんとマイグレーションファイルで書いた内容がちゃんと反映されてないと気持ち悪いし、
スキーマロードか、スキーマダンプDBスラスキーマRBの内容を使ってDBを作るみたいなときに、
スキーマ名がEnable extensionに書かれてないと何のこっちゃという話になるので、
どのスキーマに対して拡張機能を有効化するんじゃいというのがわからなくなっちゃうんで、
わからなくなっちゃうというか、デフォルトのスキーマ、DBスキーマの方になっちゃうんで良くないよねと。
ちゃんと明示的にスキーマを指定してエクステーションを有効化するのであれば、
スキーマダンプもスキーマという単語がいっぱい出てきてややこしいんですけど、
スキーマダンプもちゃんと指定したスキーマに対する拡張機能であることがわかるようになってないといけないよねということでございます。
そもそもところでなんだけれども、PostgreSQLの拡張機能って何なんですかというところを紹介しておきます。
PostgreSQLではCreate Extensionというコマンドで外部モジュールや追加機能をインストールすることができます。
例えばCreate Extension PostGISなどは地理空間のデータをサポートする拡張機能がインストールされるというようなコマンド、クエリになっています。
このほかよく使われる拡張機能として次のようなものがあります。
一つ目がUUID-OSSP。これはUUIDを生成するための拡張機能ですとか、
HStore、キーと値のペアを簡単に管理できるデータ型を提供する拡張機能とか、
PGCrypt、暗号化とハッシュ化機能を提供する拡張機能であったりとか、こういった拡張機能が便利なものがいくつかあると。
なのでPostgreで拡張機能を使いたいときはCreate Extensionっていうのを呼ぶんだよと。
アクティブレコードとしてはEnable Extensionというメソッドで引数に拡張したいモジュール追加機能の名前を渡すと、
内部的にCreate Extensionが実行されてPostgreの機能が拡張されると。そんな仕組みになっておるということでございますね。
最後3つ目、Add Escape HTML Entities Option to JSON Encoderということで、アクティブサポートに関する変更です。
ToJSONメソッドの呼び出しの際に、Escape HTML Entitiesというオプションを指定することができるようになりました。
トゥルーかフォルスかを指定するというところで、このオプションを指定することで、
Config.ActiveSupport.EscapeHTMLEntitiesInJSONの設定値を一時的に上書きできるようになりました。
例えばこれによって何が嬉しいかというと、特定のコントローラーでHTMLエスケープのやるかやらないかというのを切り替えることができるようになると。
例えばMyControllerというコントローラーがあって、インデックスアクションがあるとしましょうと。
RenderJSONHelloWorldというようなJSONを出力するというときに、HTMLEntitiesをフォルスにすると、
もしJSONの中にHTMLタグが含まれていても、そのままエスケープせずに出力するよと。
EscapeHTMLEntitiesをトゥルーを指定したら、もちろんエスケープを押して出力するよというような感じで切り替えることができるようになったよと。
Config.ActiveSupport.EscapeHTMLEntitiesInJSONって何なんですかというと、レールズガイドにも記載があります。
ここまで説明してきた通りですけど、JSONシリアライズに含まれるHTMLエンティティをエスケープするかどうかというのを指定する。
デフォルトはトゥルーですと。
基本的にはJSONに含まれるHTMLはエスケープするぞという設定にデフォルトではなっています。
これをフォルスに指定すると、全てのJSONシリアライズでHTMLエンティティがエスケープされなくなるということですね。
具体的にはエスケープは何がされるのかというと、
大なり小なりみたいな括弧のやつとか、&の記号とか、ダブルクオーテーションとか、
そういったやつらがそれぞれユニコードにエスケープされると変換されるということですね。
JSONレスポンス内にHTMLタグが混入していても、それがブラウザで意図しない形で解釈されるのを防ぐと。
これは結果的にクロスサイトスクリプティング攻撃のリスクを軽減するよということで、デフォルトはトゥルーになっていると。
ただ場合によっては、エスケープしないでほしいというケースもあるよねということで、
プルリクエストの紹介
それを各個別のToJSON、コントローラーの呼び出しとかによって切り替えられたほうが便利なんですよねということで実装されているということでございます。
こんなところで今週は3つのプルリクエストを紹介しました。
こんなところで以上とします。
ではまた来週。バイバイ。
10:41

Comments

Scroll