開発ノート@HarikoApps
HarikoApps: https://hariko.sprkls.me
2024-06-02Rails PartialのStrict Localsはどうやって実装されているのか? #1
<%# locals: (title:, comment_count: 0) %>
のように書くと、 renderで呼び出された時にパーシャルに引数として渡されるローカル変数をチェックしてくれるというものです。
今まではデフォルト値を使いたい時なんかは、
今まではデフォルト値を使いたい時なんかは、
<% comment_count = local_assigns[:comment_count] || 0 %>
のようにしていましたが、このようにスッキリ書ける書式がサポートされたのはありがたい限りです。
ところで今までRailsにはこのようにマジックコメントを書けるような機能はなかったように思う(ぼくが知らないだけかも)ので少し新鮮でした。で、疑問に思ったのがこれどうやって実装されているんだろうということです。
もしかしてパーサがある?正規表現?普通に考えれば正規表現かなぁ…
でこのPRを探してみました。結果、正規表現でした。
正規表現自体はここで実装されてます。
で、正規表現にマッチしたコメントはここでそのままメソッド化されるパーシャルの仮引数定義に設定されています。
このメソッドは view.compiled_method_container をレシーバーとして module_eval されているので、Railsのビューで使える表現なら `locals` のデフォルト値設定に使えそうです(compiled_method_containerがどのようなものかわかってないのですが…😅)。
良いかどうかは別としてヘルパーメソッドのコールなんかもデフォルト値に使えますし、普通にRubyメソッドの仮引数のようにSplat Operator(*や**)も使えます。
ところで今までRailsにはこのようにマジックコメントを書けるような機能はなかったように思う(ぼくが知らないだけかも)ので少し新鮮でした。で、疑問に思ったのがこれどうやって実装されているんだろうということです。
もしかしてパーサがある?正規表現?普通に考えれば正規表現かなぁ…
でこのPRを探してみました。結果、正規表現でした。
正規表現自体はここで実装されてます。
で、正規表現にマッチしたコメントはここでそのままメソッド化されるパーシャルの仮引数定義に設定されています。
このメソッドは view.compiled_method_container をレシーバーとして module_eval されているので、Railsのビューで使える表現なら `locals` のデフォルト値設定に使えそうです(compiled_method_containerがどのようなものかわかってないのですが…😅)。
良いかどうかは別としてヘルパーメソッドのコールなんかもデフォルト値に使えますし、普通にRubyメソッドの仮引数のようにSplat Operator(*や**)も使えます。
<%# locals: () %>
のようにすれば引数は受け取らないということも明示できるようです。
コメントだと思ってたものは、実際にはメソッドの仮引数定義でした。面白い。
コメントだと思ってたものは、実際にはメソッドの仮引数定義でした。面白い。
Updated at