はじめに
kekiと申します。
Railsでコントローラの名前を入力する際、「正しい複数形にしなかった場合どうなるのか?」と素朴な疑問が湧いたので調べてみました。
結論としては「動くが、手動で書く項目が増えてしまいデメリットしかない」となりました。
解決には下記の質問、ならびに公式ガイドを参考にさせていただきました。
検証
propertyというモデルに対し、propertysという誤表記でコントローラ名を登録した時の挙動を調べました(正しい複数形はproperties)。
コントローラは最低限new, create, indexのみ用意し、それぞれのアクションが動くのかをチェックしていきます。
Rubyのバージョンは3.0.1、Railsは6.0.3を使用しています。
1. ルーティングは通るか
まずルーティングでresources設定した時通るか?と疑問でしたが、ここは誤表記の方でちゃんとパスが生成されていました。
作成直後のビューファイルがほぼ何も書かれていないindex, new画面は問題なく起動していたので、少なくともresources上のパスが合っていれば誤表記でも動くことがわかりました。
2. new.html.erbが見れるか
さて、ではform_with
を含んだnew画面に変更するとどうなるか?というと、途端にエラーを吐きます。
エラー文をよく見てみると、二行目に"undefined method 'properties_path' for..."と書かれています。ルーティングには記載してない正しい複数形です。
この時form_with内の記述は以下のようになっていました。
<% form_with(model: @property, local: true) do |form| %>
<%= form.text_field :string %>
(略)
<% form.submit %>
<% end%>
form_with
を追加した直後にエラーが出たので、推察するにform_with
の送信先パスはmodel内の単数系を参考に、自動的に正しい複数形のパスを想定しているのではと考えました。ところが今回は実際のルーティングは'propertys_path'と誤表記のためにエラーが起きているのではないでしょうか。
3. form_withのパスを手動変更するとどうなるか
「では手動で'propertys_path'と誤表記のパスを指定してあげるとどうなるか」とパスを追記したところ、今度はnew画面もその後のcreateもうまくいきました。
<% form_with(model: @property, local: true, url: propertys_path) do |form| %>
<%= form.text_field :string %>
(略)
<% form.submit %>
<% end%>
うまく行った時のログは以下のとおりです。
きちんと(?)誤表記のpropertys_pathを通してPOSTされ、index画面に飛んでいるのが確認できました。
というわけで手動で強引にurlを指示してあげると誤表記のコントローラでも起動することがわかりました。わかりましたが、このようにデフォルトで単数系→複数形の変換を自動で行ってくれるヘルパーメソッドなどを全て手動で修正する必要があるので、はっきり言って手間しかありません。
4. 複数形が特殊なモデル名をscaffoldするとどうなるか
最後に、複数形が特殊な英単語、例えばnew, man, waterなどですね。これらでscaffoldした場合のコントローラ名はどうなるのか?という疑問で締めたいと思います。
試しにmanでscaffoldしてみました。
ちゃんと複数形のmenで自動生成されていることがわかります。
ということは不加算名詞であるwaterもwater→waterとなりそうですね。
まとめ
まとめますと、「railsのコントローラの命名規則である複数形を使うことは守ることを推奨する。理由はヘルパーメソッドやscaffoldなどで自動的に正しい複数形が用意・要求されるからである。守らない場合手動でパスを変更する必要があり、非常に手間である」とわかりました。
water, news, Japaneseのような不可算名詞はモデル名とコントローラ名が同じになることもわかったので、そう言った単語は選ばない方がいいのかもしれない、という気がします。しかし、これはまた別の機会に確認してみようと思います。
読んでくださりありがとうございました。