Nombres de controladores y ayudantes singulares o plurales en Rails

112

¿Existe alguna desventaja en el uso de nombres singulares para controladores y ayudantes? Nada parece depender de esto. Incluso parece que los ayudantes no tienen que hacer la misma elección sobre singular versus plural que sus controladores correspondientes, al menos de acuerdo con mi limitada experimentación. ¿Es eso cierto?

allyourcode
fuente
2
¡He tenido el mismo dilema al intentar decidir sobre nombres de controladores en singular o plural!
Andrew
15
gracias :) La cultura de Rails tiene una forma de hacerte sentir estúpido si cuestionas cosas como esta.
allyourcode

Respuestas:

158

Definitivamente plural .

Con enrutamiento tranquilo y un controlador singular

Controlador:

dog_controller.rb  

Rutas:

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

Usando un controlador plural

Controlador:

dogs_controller.rb

Rutas:

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

rails generate controller --help tiene ejemplos en plural:

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
fuente
23
convenido. Es confuso que el mensaje de ayuda del generador Rails 3.1 para controladores use "CreditCard" (singular) como ejemplo.
bantic
4
La ayuda de rieles ahora usa plural: rieles generan el controlador Tarjetas de crédito abiertas débito crédito cierre
notapatch
3
todavía tiene CreditCard singular aquí: guides.rubyonrails.org/command_line.html#rails-generate
rcrogers
¿Cómo podemos escribir locales para el controlador singular stackoverflow.com/questions/29650094/...
santosh
Por lo tanto, la denominación debe ser plural y mayúscula. por ejemplo:: rails generan controlador Perros nuevo índice crear eliminar destruir editar "??
BKSpurgeon
27

El uso de nombres en plural para controladores es solo una convención.

Los nombres en plural suelen parecer más naturales (especialmente para los controladores que están vinculados directamente a un modelo específico: Usuario -> Usuarios, etc.), pero puede usar lo que quiera.

En cuanto a los ayudantes, todos los ayudantes están disponibles para todos los controladores de forma predeterminada, por lo que, técnicamente, no importa en absoluto cómo nombre a sus ayudantes. Es solo otra convención para mantener las funciones auxiliares de un controlador en un ayudante con el mismo nombre que el controlador.

Can Berk Güder
fuente
10
¿No sería más natural que el controlador correspondiente al usuario fuera el UserController? Además, si confía en las rutas predeterminadas, obtendrá URL que se parecen a / users / edit, que parece que está editando a todos los usuarios. Para mí, eso no es nada natural.
allyourcode
5
@allyourcode: bueno, supongo que todo es subjetivo. para mí, tener / users lista todos los usuarios es más natural que / user.
Can Berk Güder
1
oh, y es la forma RESTful.
Can Berk Güder
3
@Can "la manera DESCANSADA" suena como un canto de culto. Sin embargo, eso no me sorprende, ya que Rails es bastante religioso en general. Me gusta cómo Rails está obsesionado con REST, pero las rutas predeterminadas no son tranquilas. Incluso configurar rutas RESTful no es natural. Incluir: condiciones => {: método =>: publicación} en el segundo argumento para conectarse no tiene sentido, ya que se supone que el hash especifica cómo manejar cualquier solicitud que coincida con la regla actual, no si una solicitud dada coincide con la regla actual .
allyourcode
2
@allyourcode De acuerdo con esto, la ruta predeterminada para editar es / users /: id / edit en lugar de / users / edit. Decir "de todos los usuarios, edite el usuario con id: id" me suena perfectamente natural.
DavidG
19

Un modelo es singular porque hace referencia a un solo objeto como Usuario. Un controlador es plural porque son los controles (métodos) para la colección de Usuarios. El nombre de las rutas depende de ese desarrollador individual. Nunca he tenido un usuario quejándose de que la URL de una solicitud web sea singular o plural. El resultado final es mantener una convención común para los contribuyentes actuales y futuros mientras se ofrecen visualizaciones de páginas de calidad o solicitudes de API para los usuarios finales.

Ryan
fuente
12

Tienes una explicación muy completa en las guías de Rails: http://edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default

Nerian
fuente
4
en realidad, esta es la respuesta correcta porque si la lees, explica que el plural es la respuesta correcta para una colección de recursos. Para un recurso singleton, singular es la respuesta correcta. Ejemplos en la documentación. Y en realidad, esto está bien respondido en esta otra publicación: stackoverflow.com/questions/2614858/…
Rob
¡Las respuestas respaldadas por referencias oficiales como en esta publicación ayudan mucho a los novatos! Gracias
Wasif Hossain
9

Es la convención de Rails que un controlador maneja un modelo, ya sea que una o más instancias de ese modelo puedan existir durante el tiempo de ejecución. Sin embargo, puede tener una aplicación Rails donde (algunos de) los controladores (y las vistas asociadas) no están asociados con ningún modelo en particular, sino que manejan un conjunto de funciones más complejo. En este caso, la pluralización automática no tiene ningún sentido.

La aplicación Rails en la que estoy trabajando actualmente encaja en esta categoría, y es simplemente una irritación para mí que Rails espere que los identificadores que defino como singular en un lugar se usen en su forma plural en otros lugares. Por ejemplo, podría querer definir algo como esto en config/routes.rb:

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

y luego quiero que un controlador DashboardControllermuestre información resumida sobre ciertos aspectos de la aplicación, recopilando información de más de una tabla de base de datos. Entonces, aquí, Dashboardno se refiere a ningún modelo de la aplicación, y sería extraño tener el nombre del controlador DashboardsController.

Encontré una buena solución a la irritación de la pluralización automática en esta respuesta . En resumen, edite el archivo config/initializers/inflections.rby agregue las palabras que no desea que se pluralicen automáticamente a esta definición:

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

La convención de nomenclatura de los controladores en Rails favorece la pluralización de la última palabra en el nombre del controlador, aunque no es estrictamente necesario (p. Ej.ApplicationController . .).

Por ejemplo, ClientsControlleres preferible a ClientController, SiteAdminsControlleres preferible a SiteAdminControlleroSitesAdminsController , y así sucesivamente.

Seguir esta convención le permitirá utilizar los generadores de ruta predeterminados (por ejemplo, recursos, etc.) sin necesidad de calificar cada uno :patho:controller , y mantendrá el uso de URL y ayudantes de ruta consistente en toda su aplicación.

Ref: Controlador de nomenclatura Convención-Rails Doc

Mukesh Singh Rathaur
fuente
2

Me siento mejor cuando uso singular para el nombre del controlador

Dillone Hailei Wang
fuente
2

Si el controlador es un recurso, entonces debe ser plural ...

Por ejemplo

Controlador

articles_controller.rb

Modelo

article.rb

Pero puede usar nombres de controlador singulares cuando no tiene modelos correspondientes como

welcome_controller.rb

fuente
1

El uso de plurales simplemente suena mejor, y luego, si tiene un controlador que maneja un recurso singular, es decir, un usuario, aún puede nombrar la URL / usuario.

Con los ayudantes, a menudo no es necesario tener un ayudante para cada controlador, y a menudo habrá métodos de ayuda que puede usar ascorss múltiples controladores y, en su lugar, ensuciarlos a través de su ayudante de aplicación, podría ponerlos en ayudantes personalizados en su lugar, como por ejemplo, layout_helper o cualquier otro archivo bien nombrado.

nitecoder
fuente
Mismos comentarios que para Can Berk Guder. Además, ¡tuve algunos problemas para seguir tu última oración / párrafo porque había muy poca puntuación!
allyourcode
1
Lo siento, todo lo que quise decir es que puede ser una mejor idea crear ayudantes personalizados en lugar de usar los valores predeterminados, ya que el nombre de los predeterminados no siempre captura completamente dónde se van a usar. Si tiene varios métodos auxiliares que se utilizarán para el diseño, llámelo layout_helper.
nitecoder