また社内で質問されたので回答です。
微妙に内容は変えてあります。
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分は遊べますよ。