1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Railsのコントローラ名を正しい複数形にしないとどうなるか?

Last updated at Posted at 2023-08-27

はじめに

kekiと申します。

Railsでコントローラの名前を入力する際、「正しい複数形にしなかった場合どうなるのか?」と素朴な疑問が湧いたので調べてみました。
結論としては「動くが、手動で書く項目が増えてしまいデメリットしかない」となりました。

解決には下記の質問、ならびに公式ガイドを参考にさせていただきました。

【Rails】Controllerの命名規則について

コントローラの命名規約(公式ガイド)

検証

propertyというモデルに対し、propertysという誤表記でコントローラ名を登録した時の挙動を調べました(正しい複数形はproperties)。
コントローラは最低限new, create, indexのみ用意し、それぞれのアクションが動くのかをチェックしていきます。
Rubyのバージョンは3.0.1、Railsは6.0.3を使用しています。

1. ルーティングは通るか

まずルーティングでresources設定した時通るか?と疑問でしたが、ここは誤表記の方でちゃんとパスが生成されていました。
スクリーンショット 2023-08-25 18.59.12.png
作成直後のビューファイルがほぼ何も書かれていないindex, new画面は問題なく起動していたので、少なくともresources上のパスが合っていれば誤表記でも動くことがわかりました。

2. new.html.erbが見れるか

さて、ではform_withを含んだnew画面に変更するとどうなるか?というと、途端にエラーを吐きます
スクリーンショット 2023-08-25 19.06.18.png

エラー文をよく見てみると、二行目に"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%>

うまく行った時のログは以下のとおりです。
スクリーンショット 2023-08-27 11.23.47.png
きちんと(?)誤表記のpropertys_pathを通してPOSTされ、index画面に飛んでいるのが確認できました。

というわけで手動で強引にurlを指示してあげると誤表記のコントローラでも起動することがわかりました。わかりましたが、このようにデフォルトで単数系→複数形の変換を自動で行ってくれるヘルパーメソッドなどを全て手動で修正する必要があるので、はっきり言って手間しかありません

4. 複数形が特殊なモデル名をscaffoldするとどうなるか

最後に、複数形が特殊な英単語、例えばnew, man, waterなどですね。これらでscaffoldした場合のコントローラ名はどうなるのか?という疑問で締めたいと思います。

試しにmanでscaffoldしてみました。
スクリーンショット 2023-08-25 19.19.08.png
ちゃんと複数形のmenで自動生成されていることがわかります。
ということは不加算名詞であるwaterもwater→waterとなりそうですね。

まとめ

まとめますと、「railsのコントローラの命名規則である複数形を使うことは守ることを推奨する。理由はヘルパーメソッドやscaffoldなどで自動的に正しい複数形が用意・要求されるからである。守らない場合手動でパスを変更する必要があり、非常に手間である」とわかりました。

water, news, Japaneseのような不可算名詞はモデル名とコントローラ名が同じになることもわかったので、そう言った単語は選ばない方がいいのかもしれない、という気がします。しかし、これはまた別の機会に確認してみようと思います。

読んでくださりありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?