Singular- oder Plural-Controller- und Helfer-Namen in Rails

112

Gibt es einen Nachteil bei der Verwendung von Singularnamen für Controller und Helfer? Darauf scheint sich nichts zu stützen. Es scheint sogar, dass Helfer nicht die gleiche Wahl zwischen Singular und Plural treffen müssen wie ihre entsprechenden Controller, zumindest nach meinen begrenzten Experimenten. Ist das wahr?

allyourcode
quelle
2
Ich hatte das gleiche Dilemma beim Versuch, mich für Singular- oder Plural-Controllernamen zu entscheiden!
Andrew
15
danke :) Die Rails-Kultur hat eine Art, dich dumm zu fühlen, wenn du solche Dinge in Frage stellst.
Allyourcode

Antworten:

158

Auf jeden Fall Plural .

Mit erholsamem Routing und einem einzigartigen Controller

Regler:

dog_controller.rb  

Routen:

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

Verwenden eines Plural-Controllers

Regler:

dogs_controller.rb

Routen:

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

rails generate controller --help hat mehrere Beispiele:

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
jpgeek
quelle
23
einverstanden. Es ist verwirrend, dass die Hilfemeldung des Rails 3.1-Generators für Controller "CreditCard" (Singular) als Beispiel verwendet.
Bantic
4
Rails Help verwendet jetzt Plural: Rails generieren Controller CreditCards Open Debit Credit Close
Notapatch
3
hat noch einzigartige Kreditkarte hier: Guides.rubyonrails.org/command_line.html#rails-generate
rcrogers
Wie können wir Gebietsschemas für Singular Controller Stackoverflow.com/questions/29650094/…
Santosh
Die Benennung sollte also Plural sein und kam Fall. zB
::
27

Die Verwendung mehrerer Namen für Controller ist nur eine Konvention.

Mehrere Namen klingen normalerweise natürlicher (insbesondere für Controller, die direkt an ein bestimmtes Modell gebunden sind: Benutzer -> Benutzer usw.), aber Sie können alles verwenden, was Sie möchten.

Bei den Helfern sind standardmäßig alle Helfer für alle Controller verfügbar. Technisch gesehen spielt es also keine Rolle, wie Sie Ihre Helfer benennen. Es ist nur eine andere Konvention, die Hilfsfunktionen eines Controllers in einem Helfer mit demselben Namen wie der Controller zu belassen.

Kann Berk Güder
quelle
10
Wäre es nicht natürlicher, wenn der Controller, der dem Benutzer entspricht, der UserController ist? Wenn Sie sich auf die Standardrouten verlassen, erhalten Sie URLs, die wie / users / edit aussehen. Dies sieht so aus, als würden Sie alle Benutzer bearbeiten. Für mich ist das überhaupt nicht sehr natürlich.
Allyourcode
5
@allyourcode: Nun, ich denke, es ist alles subjektiv. Für mich ist es natürlicher, wenn / users alle Benutzer auflistet als / user.
Kann Berk Güder
1
Oh, und es ist der ruhige Weg.
Kann Berk Güder
3
@Can "the RESTful way" klingt wie ein kultischer Gesang. Das überrascht mich allerdings nicht wirklich, da Rails insgesamt ziemlich religiös ist. Mir gefällt, wie sehr Rails von REST besessen ist, aber Standardrouten sind nicht erholsam. Selbst das Konfigurieren von RESTful-Routen ist unnatürlich. Das Einfügen von: Bedingungen => {: Methode =>: Post} in das zweite zu verbindende Argument macht keinen Sinn, da der Hash angeben soll, wie eine Anforderung behandelt werden soll, die der aktuellen Regel entspricht, und nicht, ob eine bestimmte Anforderung mit der aktuellen Regel übereinstimmt .
Allyourcode
2
@allyourcode Nach dieser die Standardroute für die Bearbeitung ist / users /: id / bearbeiten statt / users / bearbeiten. Zu sagen "von allen Benutzern den Benutzer mit id: id bearbeiten" klingt für mich ganz natürlich.
DavidG
19

Ein Modell ist singulär, weil es auf ein einzelnes Objekt wie User verweist. Ein Controller ist Plural, da es sich um die Steuerelemente (Methoden) für die Erfassung von Benutzern handelt. Wie man die Routen benennt, hängt von diesem einzelnen Entwickler ab. Ich habe noch nie einen Benutzer beschweren lassen, dass eine URL für eine Webanforderung Singular oder Plural ist. Das Endergebnis ist die Beibehaltung einer gemeinsamen Konvention für aktuelle und zukünftige Mitwirkende, während hochwertige Seitenanzeigen oder API-Anforderungen für die Endbenutzer bereitgestellt werden.

Ryan
quelle
12

Eine sehr vollständige Erklärung finden Sie in den Rails-Handbüchern: http://edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default

Nerian
quelle
4
Tatsächlich ist dies die richtige Antwort, wenn Sie es lesen. Es erklärt, dass Plural die richtige Antwort für eine Sammlung von Ressourcen ist. Für eine Singleton-Ressource ist Singular die richtige Antwort. Beispiele in der Dokumentation. Und tatsächlich ist dies in diesem anderen Beitrag gut beantwortet: stackoverflow.com/questions/2614858/…
Rob
Antworten, die durch offizielle Referenzen wie in diesem Beitrag unterstützt werden, helfen Neulingen sehr! Vielen Dank
Wasif Hossain
9

Es ist die Rails-Konvention, dass ein Controller ein Modell verarbeitet, unabhängig davon, ob eine oder mehrere Instanzen dieses Modells zur Laufzeit vorhanden sein können. Sie können jedoch eine Rails-Anwendung verwenden, bei der (einige) der Controller (und die zugehörigen Ansichten) keinem bestimmten Modell zugeordnet sind, sondern einen komplexeren Satz von Funktionen verarbeiten. In diesem Fall macht die automatische Pluralisierung keinen Sinn.

Die Rails-Anwendung, an der ich gerade arbeite, passt in diese Kategorie, und es ist für mich nur eine Irritation, dass Rails erwartet, dass die Bezeichner, die ich an einer Stelle als Singular definiere, dann an anderen Stellen in ihrer Pluralform verwendet werden. Zum Beispiel möchte ich so etwas vielleicht definieren in config/routes.rb:

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

und dann möchte ich, dass ein Controller DashboardControllerzusammenfassende Informationen zu bestimmten Aspekten der Anwendung anzeigt und Informationen aus mehr als einer Datenbanktabelle sammelt. Bezieht sich hier Dashboardalso nicht auf ein Modell der Anwendung, und es wäre einfach komisch, den Namen des Controllers zu haben DashboardsController.

In dieser Antwort fand ich eine gute Lösung für die Irritation der automatischen Pluralisierung . Kurz gesagt, bearbeiten Sie die Datei config/initializers/inflections.rbund fügen Sie die Wörter, die nicht automatisch pluralisiert werden sollen, zu dieser Definition hinzu:

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

Die Namenskonvention von Controllern in Rails begünstigt die Pluralisierung des letzten Wortes im Namen des Controllers, obwohl dies nicht unbedingt erforderlich ist (zApplicationController . ).

Zum Beispiel ClientsControllerist vorzuziehen ClientController, SiteAdminsControllerist vorzuziehen gegenüber SiteAdminController oderSitesAdminsController und so weiter.

Wenn Sie diese Konvention befolgen, können Sie die Standard-Routengeneratoren (z. B. Ressourcen usw.) verwenden, ohne die einzelnen :pathoder qualifizieren zu müssen:controller , und die Verwendung von URL- und Pfad-Helfern in Ihrer gesamten Anwendung konsistent halten.

Ref: Controller Naming Convention-Rails Doc

Mukesh Singh Rathaur
quelle
2

Ich fühle mich besser, wenn ich Singular für den Controller-Namen verwende

Dillone Hailei Wang
quelle
2

Wenn der Controller eine Ressource ist, muss er plural sein ...

Beispielsweise

Regler

articles_controller.rb

Modell

article.rb

Sie können jedoch einzelne Controller-Namen verwenden, wenn Sie keine entsprechenden Modelle wie haben

welcome_controller.rb

quelle
1

Die Verwendung von Pluralformen klingt einfach besser. Wenn Sie dann einen Controller haben, der eine einzelne Ressource verwaltet, dh einen Benutzer, können Sie die URL / den Benutzer trotzdem benennen.

Bei Helfern ist es oft nicht erforderlich, für jeden Controller einen Helfer zu haben, und oft gibt es Hilfsmethoden, mit denen Sie mehrere Controller verwenden und sie alle über Ihren Anwendungshelfer verunreinigen können. Sie können sie stattdessen in benutzerdefinierte Helfer wie z. B. layout_helper oder einen anderen einfügen andere gut benannte Datei.

Nitecoder
quelle
Gleiche Kommentare wie für Can Berk Guder. Außerdem hatte ich einige Probleme, Ihrem letzten Satz / Absatz zu folgen, weil es so wenig Interpunktion gab!
Allyourcode
1
Tut mir leid, ich meinte nur, dass es möglicherweise eine bessere Idee ist, benutzerdefinierte Helfer zu erstellen, als die Standardeinstellungen zu verwenden, da der Name der Standardhelfer nicht immer vollständig erfasst, wo sie verwendet werden sollen. Wenn Sie über eine Reihe von Hilfsmethoden verfügen, die für das Layout verwendet werden, nennen Sie sie layout_helper.
Nitecoder