Tech Racho エンジニアの「?」を「!」に。
  • 開発

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

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

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分は遊べますよ。


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。