Railsでの単数形または複数形のコントローラーとヘルパーの名前


112

コントローラーとヘルパーに単数形の名前を使用することに不利な点はありますか?これに依存しているようには見えません。少なくとも私の限られた実験によれば、ヘルパーは対応するコントローラーとして単数と複数について同じ選択をする必要がないようです。本当?


2
単数または複数のコントローラー名を決定しようとする同じジレンマがありました!
アンドリュー、

15
おかげで:) Railsカルチャーには、このようなことについて質問すると、あなたを愚かに感じさせる方法があります。
allyourcode

回答:


158

間違いなく複数

落ち着いたルーティングと特異なコントローラー

コントローラ:

dog_controller.rb  

ルート:

map.resources :dogs  # => blows up  
map.resources :dog  # is ok, but...  
dogs_path # => blows up  
dog_path  # => ok  

複数のコントローラーを使用する

コントローラ:

dogs_controller.rb

ルート:

map.resources :dogs  
dogs_path # => ok  
dog_path # => ok  

rails generate controller --help 複数の例があります:

Example:
`rails generate controller CreditCards open debit credit close`

CreditCards controller with URLs like /credit_cards/debit.
    Controller: app/controllers/credit_cards_controller.rb
    Test:       test/controllers/credit_cards_controller_test.rb
    Views:      app/views/credit_cards/debit.html.erb [...]
    Helper:     app/helpers/credit_cards_helper.rb

23
同意した。コントローラーのRails 3.1ジェネレーターのヘルプメッセージで「CreditCard」(単数形)を例として使用していると混乱します。
11

4
Railsのヘルプで複数形が使用されるようになりました:RailsがコントローラーCreditCardsオープンデビットクレジットクローズを生成します
notapatch

3
まだここに単一のクレジットカードがあり
rcrogers '

どのように我々は、特異コントローラのためのロケール書くことができます stackoverflow.com/questions/29650094/...
santosh

したがって、ネーミングは複数である必要があり、ケースが来ました。例::rails generate controller
dogs

27

コントローラに複数の名前を使用するのは慣例にすぎません。

通常、複数の名前はより自然に聞こえます(特に、特定のモデルに直接関連付けられているコントローラーの場合:ユーザー->ユーザーなど)。好きなように使用できます。

ヘルパーについては、すべてのヘルパーがデフォルトですべてのコントローラーで使用可能であるため、技術的には、ヘルパーの名前の付け方はまったく問題ではありません。コントローラーのヘルパー関数を、コントローラーと同じ名前のヘルパーに保持することは、もう1つの規則です。


10
Userに対応するコントローラーがUserControllerである方が自然ではないでしょうか?また、デフォルトのルートに依存している場合、/ users / editのようなURLを取得します。これは、すべてのユーザーを編集しているように見えます。私には、それはまったく自然なことではありません。
allyourcode 2009年

5
@allyourcode:まあ、それはすべて主観的なものだと思います。私にとって、/ usersにすべてのユーザーをリストさせるのは、/ userよりも自然です。
Can BerkGüder、2009年

1
ああ、それはRESTfulな方法です。
Can BerkGüder、2009年

3
@「RESTfulな方法」はカルト的な聖歌のように聞こえます。Railsは全体的にかなり宗教的であるので、それは私を驚かせません。RailsがRESTに夢中になっているのが好きですが、デフォルトのルートは落ち着きません。RESTfulルートを構成することも不自然です。接続する2番目の引数に:conditions => {:method =>:post}を含めても意味がありません。ハッシュは現在のルールに一致するリクエストを処理する方法を指定するものであり、特定のリクエストが現在のルールに一致するかどうかを指定するものではないためです。
allyourcode 2009年

2
@allyourcodeによると、この代わりに/ユーザー/編集のID /編集:編集のデフォルトルートユーザー/ /です。「すべてのユーザーのうち、id:idでユーザーを編集」と言うのは、私にとってはまったく自然なことです。
DavidG 2013

19

Userのような単一のオブジェクトを参照するため、Modelは特異です。コントローラーは、ユーザーのコレクションのコントロール(メソッド)であるため、複数形です。ルートに名前を付ける方法は、個々の開発者次第です。WebリクエストのURLが単数形または複数形であるとユーザーから文句を言われたことはありません。最終結果は、高品質のページ表示またはエンドユーザーへのAPIリクエストを提供しながら、現在および将来の貢献者に共通の慣習を維持することです。


12

Railsガイドで非常に完全な説明があります:http : //edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default


4
これを読んだ場合、実際にはこれが正しい答えです。リソースのコレクションに対して複数が正しい答えであることを説明しています。シングルトンリソースの場合、正解は正解です。ドキュメントの例。そして実際に、これはよくこの他のポストに答えている:stackoverflow.com/questions/2614858/...
ロブ・

この投稿のように、公式リファレンスに裏付けされた回答は、初心者に大いに役立ちます。ありがとう
Wasif Hossain

9

実行時にそのモデルの1つ以上のインスタンスが存在できるかどうかに関係なく、1つのコントローラーが1つのモデルを処理するのはRailsの規則です。ただし、コントローラー(および関連するビュー)が特定のモデルに関連付けられておらず、より複雑な機能セットを処理するRailsアプリケーションを使用できます。この場合、自動複数化は意味がありません。

私が現在取り組んでいるRailsアプリケーションはこのカテゴリーに当てはまり、Railsが1つの場所で単数形として定義した識別子が他の場所で複数の形で使用されることをRailsが期待していることは単に苛立ちです。たとえば、次のように定義したい場合がありますconfig/routes.rb

  resource :dashboard, :only => [:show]

次に、コントローラーDashboardControllerに、アプリケーションの特定の側面に関する要約情報を表示して、複数のデータベーステーブルから情報を収集させたいと思います。したがって、ここでDashboardは、アプリケーションのどのモデルも参照していませんDashboardsController。コントローラの名前をにするのは奇妙です。

私はこの回答で自動複数化の苛立ちに対する良い解決策を見つけました。つまり、ファイルconfig/initializers/inflections.rbを編集して、自動的に複数形にしたくない単語をこの定義に追加します。

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable %w( dashboard foo bar baz )
end

3

Railsでのコントローラーの命名規則では、厳密には必須ではありませんが、コントローラーの名前の最後の単語の複数形化優先されます(たとえば、ApplicationController)。

たとえば、ClientsControllerがにClientController、r SiteAdminsControllerがに、が好ましい、などです。SiteAdminControlleSitesAdminsController

この規則に従うことで、:pathorやを修飾する必要なく、デフォルトのルートジェネレーター(リソースなど)を使用できるように:controllerなり、URLとパスヘルパーの使用法をアプリケーション全体で一貫させることができます。

参照:コントローラ命名規則-Rails Doc



2

コントローラがリソースの場合、複数である必要があります...

例えば

コントローラ

articles_controller.rb

型番

article.rb

ただし、次のような対応するモデルがない場合は、単一のコントローラー名を使用できます。

welcome_controller.rb

1

複数形を使用した方がいいように聞こえますが、単一のリソース、つまりユーザーを処理するコントローラーがある場合は、URLに/ userという名前を付けることができます。

ヘルパーを使用すると、多くの場合、すべてのコントローラーにヘルパーを用意する必要がありません。多くの場合、複数のコントローラーをアスコルスで使用できるヘルパーメソッドがあり、アプリケーションヘルパーを通してそれらすべてを散らかすことができます。たとえば、layout_helperなどのカスタムヘルパーに配置できます。他の適切な名前のファイル。


Can Berk Guderと同じコメント。また、句読点がほとんどないため、最後の文/段落をたどることができませんでした。
allyourcode

1
それについて申し訳ありませんが、私が意図したことは、デフォルトの名前は常に使用される場所を完全にキャプチャするとは限らないため、デフォルトを使用するよりもカスタムヘルパーを作成する方が良いということです。レイアウトに使用されるヘルパーメソッドが多数ある場合は、layout_helperと呼びます。
nitecoder、2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.