Rails 7でalertやnoticeというアクション名が使えないやつ
今月もRailsアプリをひとつ7.0に上げようと思って作業していたところ、どうも #notice
というアクションを使って実現されているエンドポイントがRails 7.0で動かないということが分かった。調べてみると、次のPull Requestでの変更が原因であることが分かった。
Rails 7.0未満だと #alert
や #notice
という名前のアクションを利用できるが、Rails 7.0に上げるとこれが動かなくなるという話。Railsのコントローラーにはflashという機能があって、flash[:alert]
や flash[:notice]
という風にアクセスして使えるんだけど、このalertやnoticeという語が登録制になってて、登録時についでに #alert
や #notice
というメソッドも便利だから定義しとこ、みたいな実装になっている。それで、Rails 7.0未満まではこれらのメソッドもアクションとして誤認されてしまう実装になっていたので、これをRails 7.0で修正したところ、上書きしてアクションとして使っていたユーザーが影響を受けるようになってしまった、という顛末。
この問題については独立したIssueが無くて話しづらかったので、一応Issueを立てておいた。
対案のない問題提起も微妙だと思い、こうすると良いんじゃないかという解決案として、自分でもPull Requestを出してみている。この #alert
や #notice
とかはどうもビューで使うことを想定しているメソッドのようだから、コントローラーではなくヘルパーのレイヤーに定義すれば問題が回避されるんじゃないのという案である。但し、この変更によってこれまでコントローラーでそれらのメソッドをflashのために使っていた人は影響を受けてしまうという注意点がある。
対応していたRailsアプリでは結局どうしたかと言うと、そもそも #notice
とかいうアクション名は複数の観点で良くないからやめようよ、ということで別の適切な名前のコントローラーと適切な名前のアクション名に変えるような変更で対処した。
あまり良くなさそうなアクション名の変更を提案したいときに、過去にこういうこともあって…とにかくアクションは想定されているような名前にしておいた方が…という説得材料として使えるかもしれない。若干の政治っぽさがあるが…。