QA@IT
«回答へ戻る

回答を投稿

最終的に言ってまえば「好み」ではありますが、私はシンボルやActiveModel(以下AMo)オブジェクトを渡してURL生成させるのが好きなので、メリットを説明してみますね。

シンボル渡しについて

まずシンボル渡しの動きとしては、それをto_sして_urlをつけたnamed routeを呼び出します。つまり、url_for(:about)about_urlを内部で呼び出します(前にソース読んだときはそうなっていました...)。

また、複数のシンボルを渡せます。すると_でつないだ上で上記処理をしたはずです。つまり[:admin, :signin]ではadmin_signin_urlを呼びます。これはkennさんも言っているようにネストしたのを扱う場合には便利かと思います。

という内部の動きがイメージできていると、使うのに抵抗はなくなると思われます。その上で、記述量がコンパクトになるので私は好んで使っています。とくにデメリット(パフォーマンスやメンテナンス性や有意に落ちる、など)は感じていません。

これがすごい

このシンボル渡しも良いのですが、AMoオブジェクトを渡したルーティングと組み合わせるととってもcoolです。AMoオブジェクトを使う場合と、そのクラス名とIDからいい感じにnamed routeの呼び出しが作れます。

例えば

url_for(user)

user_url(user.id)

と同じように動きます。このAMo渡しもネストできるので、

url_for([User.find(1), Post.find(42)])

では

user_post_url(User.find(1), Post.find(42))

相当になります。

という前置きで、AMo渡しはシンボル渡しとも組み合わせられるため

url_for([:admin, User.find(1)])

という呼び出し方で

admin_user_url(User.find(1))

相当のnamed route呼び出しになります。これは実際に使ってみるとかなり便利で、新しくアプリを使う場面のほとんどではAMo渡しをベースにURLを作っています。必然、単純にAMoオブジェクトを渡すだけで解決できない場合はシンボル渡しをよく使います。

ちなみにこの配列渡しの書き方はform_forの引数にも使えます。その場合、配列で渡した場合の最後のAMoオブジェクトがフォームのオブジェクトになります。

まとめ

ということで、まとめると次のような感じになります。

  • シンボル渡しとAMo渡しを組み合わせるととても便利
  • ↑との一貫した書き方をするためにシンボルもよく使います
  • という話を拙著の http://www.sbcr.jp/products/4797363821.html レシピ20に書いておりますので、よろしければご覧ください。
最終的に言ってまえば「好み」ではありますが、私はシンボルやActiveModel(以下AMo)オブジェクトを渡してURL生成させるのが好きなので、メリットを説明してみますね。

## シンボル渡しについて

まずシンボル渡しの動きとしては、それを`to_s`して`_url`をつけたnamed routeを呼び出します。つまり、`url_for(:about)`は`about_url`を内部で呼び出します(前にソース読んだときはそうなっていました...)。

また、複数のシンボルを渡せます。すると`_`でつないだ上で上記処理をしたはずです。つまり`[:admin, :signin]`では`admin_signin_url`を呼びます。これはkennさんも言っているようにネストしたのを扱う場合には便利かと思います。

という内部の動きがイメージできていると、使うのに抵抗はなくなると思われます。その上で、記述量がコンパクトになるので私は好んで使っています。とくにデメリット(パフォーマンスやメンテナンス性や有意に落ちる、など)は感じていません。

## これがすごい

このシンボル渡しも良いのですが、AMoオブジェクトを渡したルーティングと組み合わせるととってもcoolです。AMoオブジェクトを使う場合と、そのクラス名とIDからいい感じにnamed routeの呼び出しが作れます。

例えば 

```ruby
url_for(user)
```

は

```ruby
user_url(user.id)
```

 と同じように動きます。このAMo渡しもネストできるので、

```ruby
url_for([User.find(1), Post.find(42)])
```

では

```ruby
user_post_url(User.find(1), Post.find(42))
```
 相当になります。

という前置きで、AMo渡しはシンボル渡しとも組み合わせられるため

```ruby
url_for([:admin, User.find(1)])
```

という呼び出し方で

```ruby
admin_user_url(User.find(1))
```

相当のnamed route呼び出しになります。これは実際に使ってみるとかなり便利で、新しくアプリを使う場面のほとんどではAMo渡しをベースにURLを作っています。必然、単純にAMoオブジェクトを渡すだけで解決できない場合はシンボル渡しをよく使います。

ちなみにこの配列渡しの書き方は`form_for`の引数にも使えます。その場合、配列で渡した場合の最後のAMoオブジェクトがフォームのオブジェクトになります。

## まとめ

ということで、まとめると次のような感じになります。

* シンボル渡しとAMo渡しを組み合わせるととても便利
* ↑との一貫した書き方をするためにシンボルもよく使います
* という話を拙著の http://www.sbcr.jp/products/4797363821.html レシピ20に書いておりますので、よろしければご覧ください。