括弧を付けないとこうなる

また社内で質問されたので回答です。
微妙に内容は変えてあります。

redirect_to root_path, alert: "hogehoge"
だとセッションに”hogehoge”と保存されるが、

redirect_to action: "index", alert: "hogehoge"
だとURLに”hogehoge”と付与される。

何が違うのか?

単純に演算子優先順位の関係で、引数が違う解釈をされています。

1個目はこうなります。

redirect_to root_path, alert: "hogehoge"

redirect_to(root_path, {alert: "hogehoge"})

/にリダイレクト、flash[:alert]に”hogehoge”をセット

2個目はこんな感じ。

redirect_to action: "index", alert: "hogehoge"

redirect_to({action: "index", alert: "hogehoge"})
↓(内部的に)
redirect_to(url_for({action: "index", alert: "hogehoge"}))

/?alert=hogehogeにリダイレクト

2個目みたいな書き方でflashメッセージをセットしたければ、こうすれば良いですね。
redirect_to({action: "index"}, {alert: "hogehoge"})

これは極端な例ですが、Rubyに不慣れな人のコードを見ると、and/or演算子などで間違えているコードを散見します。
そういうのに限って、滅多にtrueにならない条件のANDで繋いであって、短絡評価のせいで発見しづらかったりします。

ややこしい優先順位の時は括弧を使おう
単体テストしよう

可変長引数や多重代入、引数の個数がチェックされないブロックなどと組み合わせると、更に複雑です。気になったら、arity眺めるだけで30分は遊べますよ。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。得意分野はWeb全般、Ruby on Rails、Androidアプリケーションなど。最近はBlinkと格闘中。軽度の資格マニアで、情報処理技術者試験(高度10区分)などを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ