QA@IT
«回答へ戻る

yet another addendum

2024
 それぞれのrationaleをみて、自身の要件に合うかどうかを評価するしかないと思います。
 
 ただ、私見でいうと、いずれにせよlocalesに大量の定義が発生してDRYでないうえに、localesはファイル上での距離も遠いので、メンテにより多くのエネルギーが必要で、developers happinesは落ちるような気がします。
+
+## 勘違いしていたのでさらに追記
+
+あぁ、よくみるとtはリンクテキストのほうでした。すみません。urlのほうにsymbolを使うのは、たしかに `form_for [ :admin, @item ]` みたいな感じでroutesにnamespace使ってる場合なんかに使ったりしますねそういえば。redirect_toとかでも使えるんですね、共通のところで処理されてるので考えてみれば当然なんでしょうけど。。。
+
+よくわかってなかったのですが、そいつはどうやら `ActionDispatch::Routing::PolymorphicRoutes#polymorphic_url` が処理してるようです。polymorphicなんで、モデルによらず対応するレコードを汎用的に探しだしてrouteに変換してくれる機構だと。
+
+コントローラを階層化してたりするときには、たしかにちょくちょく使う場面が出てきますね。上の例だと、対応するのは `admin_item_path(@item)` ってことになりますか。Symbol-based routeというよりは、インスタンス変数をformのターゲットに使う概念の延長上にある、という捉え方のほうがわかりやすいと思います。
+
+でもやっぱり個人的には可能な限りnamed routesを選ぶと思います。アンダースコアでつないで一個のトークンになってくれてると、リファクタリングのやりやすさが全然違いますから。
+
+それに、namespace / scopeが深いroutesでも、よくつかうrouteは、例えば `dashboard_item_subitems_path` みたいな長いやつでも、asをつかって `subitem_path` みたいな短い名前にエイリアスできるので、より可読性の改善に対する柔軟性が高いとおもいます。同じことをpolymorphic_urlでやると `[ :dashboard, :item, :subitems ]` ってやるしかないですよねたぶん。

そんなことできましたっけ?url_forのソースを見ても、 :back 以外のsymbolはないみたいですけど。。。

https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/helpers/url_helper.rb#L100

質問に対する直接の答えにはならないですが、about_pathとabout_urlの使い分けの指針は、原則として全部、より省エネな _path の相対パスで、メールのテンプレートなどwebの外(現在表示しているページというものが存在しない)で使う場合にだけ例外的に _url の絶対パスを使う、という感じでやってます。default_url_optionsでenvごとにグローバル設定しておけばhostもいちいち設定する必要ないですし。

追記を受けての追記

それはI18nのtメソッド(translateのエイリアス)ですよ。ActiveSupport::Inflectorで表現しきれないようなマッピング関係を表現するために使っているのだと思いますが、こうなってくると要件の前提が違ってくるので一般論では話せないと思います。

I18nをroutesに使うライブラリはいくつかあるようですが、

https://github.com/francesc/rails-translate-routes
https://github.com/raul/translate_routes
https://github.com/kwi/i18n_routing

それぞれのrationaleをみて、自身の要件に合うかどうかを評価するしかないと思います。

ただ、私見でいうと、いずれにせよlocalesに大量の定義が発生してDRYでないうえに、localesはファイル上での距離も遠いので、メンテにより多くのエネルギーが必要で、developers happinesは落ちるような気がします。

勘違いしていたのでさらに追記

あぁ、よくみるとtはリンクテキストのほうでした。すみません。urlのほうにsymbolを使うのは、たしかに form_for [ :admin, @item ] みたいな感じでroutesにnamespace使ってる場合なんかに使ったりしますねそういえば。redirect_toとかでも使えるんですね、共通のところで処理されてるので考えてみれば当然なんでしょうけど。。。

よくわかってなかったのですが、そいつはどうやら ActionDispatch::Routing::PolymorphicRoutes#polymorphic_url が処理してるようです。polymorphicなんで、モデルによらず対応するレコードを汎用的に探しだしてrouteに変換してくれる機構だと。

コントローラを階層化してたりするときには、たしかにちょくちょく使う場面が出てきますね。上の例だと、対応するのは admin_item_path(@item) ってことになりますか。Symbol-based routeというよりは、インスタンス変数をformのターゲットに使う概念の延長上にある、という捉え方のほうがわかりやすいと思います。

でもやっぱり個人的には可能な限りnamed routesを選ぶと思います。アンダースコアでつないで一個のトークンになってくれてると、リファクタリングのやりやすさが全然違いますから。

それに、namespace / scopeが深いroutesでも、よくつかうrouteは、例えば dashboard_item_subitems_path みたいな長いやつでも、asをつかって subitem_path みたいな短い名前にエイリアスできるので、より可読性の改善に対する柔軟性が高いとおもいます。同じことをpolymorphic_urlでやると [ :dashboard, :item, :subitems ] ってやるしかないですよねたぶん。

そんなことできましたっけ?url_forのソースを見ても、 `:back` 以外のsymbolはないみたいですけど。。。

https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/helpers/url_helper.rb#L100

質問に対する直接の答えにはならないですが、about_pathとabout_urlの使い分けの指針は、原則として全部、より省エネな `_path` の相対パスで、メールのテンプレートなどwebの外(現在表示しているページというものが存在しない)で使う場合にだけ例外的に `_url` の絶対パスを使う、という感じでやってます。default_url_optionsでenvごとにグローバル設定しておけばhostもいちいち設定する必要ないですし。

## 追記を受けての追記

それはI18nのtメソッド(translateのエイリアス)ですよ。ActiveSupport::Inflectorで表現しきれないようなマッピング関係を表現するために使っているのだと思いますが、こうなってくると要件の前提が違ってくるので一般論では話せないと思います。

I18nをroutesに使うライブラリはいくつかあるようですが、

https://github.com/francesc/rails-translate-routes
https://github.com/raul/translate_routes
https://github.com/kwi/i18n_routing

それぞれのrationaleをみて、自身の要件に合うかどうかを評価するしかないと思います。

ただ、私見でいうと、いずれにせよlocalesに大量の定義が発生してDRYでないうえに、localesはファイル上での距離も遠いので、メンテにより多くのエネルギーが必要で、developers happinesは落ちるような気がします。

## 勘違いしていたのでさらに追記

あぁ、よくみるとtはリンクテキストのほうでした。すみません。urlのほうにsymbolを使うのは、たしかに `form_for [ :admin, @item ]` みたいな感じでroutesにnamespace使ってる場合なんかに使ったりしますねそういえば。redirect_toとかでも使えるんですね、共通のところで処理されてるので考えてみれば当然なんでしょうけど。。。

よくわかってなかったのですが、そいつはどうやら `ActionDispatch::Routing::PolymorphicRoutes#polymorphic_url` が処理してるようです。polymorphicなんで、モデルによらず対応するレコードを汎用的に探しだしてrouteに変換してくれる機構だと。

コントローラを階層化してたりするときには、たしかにちょくちょく使う場面が出てきますね。上の例だと、対応するのは `admin_item_path(@item)` ってことになりますか。Symbol-based routeというよりは、インスタンス変数をformのターゲットに使う概念の延長上にある、という捉え方のほうがわかりやすいと思います。

でもやっぱり個人的には可能な限りnamed routesを選ぶと思います。アンダースコアでつないで一個のトークンになってくれてると、リファクタリングのやりやすさが全然違いますから。

それに、namespace / scopeが深いroutesでも、よくつかうrouteは、例えば `dashboard_item_subitems_path` みたいな長いやつでも、asをつかって `subitem_path` みたいな短い名前にエイリアスできるので、より可読性の改善に対する柔軟性が高いとおもいます。同じことをpolymorphic_urlでやると `[ :dashboard, :item, :subitems ]` ってやるしかないですよねたぶん。

addendum

2024
 https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/helpers/url_helper.rb#L100
 
 質問に対する直接の答えにはならないですが、about_pathとabout_urlの使い分けの指針は、原則として全部、より省エネな `_path` の相対パスで、メールのテンプレートなどwebの外(現在表示しているページというものが存在しない)で使う場合にだけ例外的に `_url` の絶対パスを使う、という感じでやってます。default_url_optionsでenvごとにグローバル設定しておけばhostもいちいち設定する必要ないですし。
+
+## 追記を受けての追記
+
+それはI18nのtメソッド(translateのエイリアス)ですよ。ActiveSupport::Inflectorで表現しきれないようなマッピング関係を表現するために使っているのだと思いますが、こうなってくると要件の前提が違ってくるので一般論では話せないと思います。
+
+I18nをroutesに使うライブラリはいくつかあるようですが、
+
+https://github.com/francesc/rails-translate-routes
+https://github.com/raul/translate_routes
+https://github.com/kwi/i18n_routing
+
+それぞれのrationaleをみて、自身の要件に合うかどうかを評価するしかないと思います。
+
+ただ、私見でいうと、いずれにせよlocalesに大量の定義が発生してDRYでないうえに、localesはファイル上での距離も遠いので、メンテにより多くのエネルギーが必要で、developers happinesは落ちるような気がします。

そんなことできましたっけ?url_forのソースを見ても、 :back 以外のsymbolはないみたいですけど。。。

https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/helpers/url_helper.rb#L100

質問に対する直接の答えにはならないですが、about_pathとabout_urlの使い分けの指針は、原則として全部、より省エネな _path の相対パスで、メールのテンプレートなどwebの外(現在表示しているページというものが存在しない)で使う場合にだけ例外的に _url の絶対パスを使う、という感じでやってます。default_url_optionsでenvごとにグローバル設定しておけばhostもいちいち設定する必要ないですし。

追記を受けての追記

それはI18nのtメソッド(translateのエイリアス)ですよ。ActiveSupport::Inflectorで表現しきれないようなマッピング関係を表現するために使っているのだと思いますが、こうなってくると要件の前提が違ってくるので一般論では話せないと思います。

I18nをroutesに使うライブラリはいくつかあるようですが、

https://github.com/francesc/rails-translate-routes
https://github.com/raul/translate_routes
https://github.com/kwi/i18n_routing

それぞれのrationaleをみて、自身の要件に合うかどうかを評価するしかないと思います。

ただ、私見でいうと、いずれにせよlocalesに大量の定義が発生してDRYでないうえに、localesはファイル上での距離も遠いので、メンテにより多くのエネルギーが必要で、developers happinesは落ちるような気がします。

そんなことできましたっけ?url_forのソースを見ても、 `:back` 以外のsymbolはないみたいですけど。。。

https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/helpers/url_helper.rb#L100

質問に対する直接の答えにはならないですが、about_pathとabout_urlの使い分けの指針は、原則として全部、より省エネな `_path` の相対パスで、メールのテンプレートなどwebの外(現在表示しているページというものが存在しない)で使う場合にだけ例外的に `_url` の絶対パスを使う、という感じでやってます。default_url_optionsでenvごとにグローバル設定しておけばhostもいちいち設定する必要ないですし。

## 追記を受けての追記

それはI18nのtメソッド(translateのエイリアス)ですよ。ActiveSupport::Inflectorで表現しきれないようなマッピング関係を表現するために使っているのだと思いますが、こうなってくると要件の前提が違ってくるので一般論では話せないと思います。

I18nをroutesに使うライブラリはいくつかあるようですが、

https://github.com/francesc/rails-translate-routes
https://github.com/raul/translate_routes
https://github.com/kwi/i18n_routing

それぞれのrationaleをみて、自身の要件に合うかどうかを評価するしかないと思います。

ただ、私見でいうと、いずれにせよlocalesに大量の定義が発生してDRYでないうえに、localesはファイル上での距離も遠いので、メンテにより多くのエネルギーが必要で、developers happinesは落ちるような気がします。

回答を投稿

そんなことできましたっけ?url_forのソースを見ても、 :back 以外のsymbolはないみたいですけど。。。

https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/helpers/url_helper.rb#L100

質問に対する直接の答えにはならないですが、about_pathとabout_urlの使い分けの指針は、原則として全部、より省エネな _path の相対パスで、メールのテンプレートなどwebの外(現在表示しているページというものが存在しない)で使う場合にだけ例外的に _url の絶対パスを使う、という感じでやってます。default_url_optionsでenvごとにグローバル設定しておけばhostもいちいち設定する必要ないですし。

そんなことできましたっけ?url_forのソースを見ても、 `:back` 以外のsymbolはないみたいですけど。。。

https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/helpers/url_helper.rb#L100

質問に対する直接の答えにはならないですが、about_pathとabout_urlの使い分けの指針は、原則として全部、より省エネな `_path` の相対パスで、メールのテンプレートなどwebの外(現在表示しているページというものが存在しない)で使う場合にだけ例外的に `_url` の絶対パスを使う、という感じでやってます。default_url_optionsでenvごとにグローバル設定しておけばhostもいちいち設定する必要ないですし。