Controlador singular ou plural e nomes de auxiliares no Rails


112

Existe alguma desvantagem em usar nomes singulares para controladores e auxiliares? Nada parece depender disso. Parece até que os ajudantes não precisam fazer a mesma escolha sobre o singular versus o plural que seus controladores correspondentes, pelo menos de acordo com minha experimentação limitada. Isso é verdade?


2
Eu tive o mesmo dilema ao tentar decidir sobre nomes de controladores no singular ou no plural!
Andrew

15
obrigado :) A cultura Rails tem um jeito de fazer você se sentir estúpido se você questionar coisas assim.
allyourcode

Respostas:


158

Definitivamente plural .

Com roteamento tranquilo e um controlador único

Controlador:

dog_controller.rb  

Rotas:

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

Usando um controlador plural

Controlador:

dogs_controller.rb

Rotas:

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

rails generate controller --help tem exemplos plurais:

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
acordado. É confuso que a mensagem de ajuda do gerador Rails 3.1 para controladores use "CreditCard" (singular) como exemplo.
bantic

4
Rails help agora usa plural: rails generate controller CreditCards aberto débito crédito close
notapatch

3
ainda tem um cartão de crédito único aqui: guias.rubyonrails.org/command_line.html#rails-generate
rcrogers

Como podemos escrever locales para o controlador singular stackoverflow.com/questions/29650094/…
santosh

Portanto, a nomenclatura deve ser plural e vir maiúscula. Ex:: rails gera controlador Cães novo índice criar excluir destruir editar "??
BKSpurgeon

27

Usar nomes plurais para controladores é apenas uma convenção.

Nomes plurais geralmente soam mais naturais (especialmente para controladores que estão ligados diretamente a um modelo específico: Usuário -> Usuários, etc.), mas você pode usar o que quiser.

Quanto aos auxiliares, todos os auxiliares estão disponíveis para todos os controladores por padrão, então, tecnicamente, como você nomeia seus auxiliares não importa de forma alguma. É apenas outra convenção manter as funções auxiliares de um controlador em um auxiliar com o mesmo nome do controlador.


10
Não seria mais natural que o controlador correspondente ao User fosse o UserController ?? Além disso, se você confiar nas rotas padrão, obterá urls que se parecem com / users / edit, que parecem estar editando todos os usuários. Para mim, isso não é nada natural.
allyourcode

5
@allyourcode: bem, acho que é tudo subjetivo. para mim, ter / users listando todos os usuários é mais natural do que / user.
Can Berk Güder,

1
oh, e é a maneira RESTful.
Can Berk Güder,

3
@Can "o caminho RESTful" soa como um canto de culto. Isso realmente não me surpreende, já que Rails é bastante religioso no geral. Eu gosto de como Rails é obcecado por REST, mas as rotas padrão não são tranquilas. Até mesmo configurar rotas RESTful não é natural. Incluir: conditions => {: method =>: post} no segundo argumento para conectar não faz sentido, já que o hash deve especificar como lidar com qualquer solicitação que corresponda à regra atual, e não se uma determinada solicitação corresponde à regra atual .
allyourcode

2
@allyourcode De acordo com isso, a rota padrão para edição é / users /: id / edit em vez de / users / edit. Dizer "de todos os usuários, edite o usuário com id: id" soa perfeitamente natural para mim.
DavidG de

19

Um modelo é singular porque faz referência a um único objeto, como usuário. Um controlador é plural porque são os controles (métodos) para a coleção de usuários. Como alguém nomeia as rotas depende do desenvolvedor individual. Nunca tive um usuário reclamando que um URL para uma solicitação da web é singular ou plural. O resultado final é manter uma convenção comum para contribuidores atuais e futuros, ao mesmo tempo em que atende exibições de páginas de qualidade ou solicitações de API para os usuários finais.


12

Você tem uma explicação muito completa nos guias do Rails: http://edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default


4
na verdade, esta é a resposta certa b / c se você lê-la, ela explica que plural é a resposta certa para uma coleção de recursos. Para um recurso singleton, singular é a resposta certa. Exemplos na documentação. E, na verdade, isso é bem respondido neste outro post: stackoverflow.com/questions/2614858/…
Rob

Respostas apoiadas por referências oficiais como neste post ajudam muito os novatos! Obrigado
Wasif Hossain

9

É a convenção do Rails que um controlador lida com um modelo, se uma ou mais instâncias desse modelo podem existir durante o tempo de execução. No entanto, você pode ter uma aplicação Rails onde (alguns dos) controladores (e as visualizações associadas) não estão associados a nenhum modelo em particular, mas sim um conjunto mais complexo de funcionalidades. Nesse caso, a pluralização automática não faz sentido.

O aplicativo Rails no qual estou trabalhando atualmente se encaixa nesta categoria, e é simplesmente uma irritação para mim que Rails espere que os identificadores que eu defino como singulares em um lugar sejam usados ​​em suas formas plurais em outros lugares. Por exemplo, posso querer definir algo assim em config/routes.rb:

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

e quero que um controlador DashboardControllerexiba informações resumidas sobre certos aspectos do aplicativo, reunindo informações de mais de uma tabela de banco de dados. Portanto, aqui, Dashboardnão se refere a nenhum modelo da aplicação, e seria estranho ter o nome do controladorDashboardsController .

Encontrei uma boa solução para a irritação da pluralização automática nesta resposta . Resumindo, edite o arquivo config/initializers/inflections.rbe adicione as palavras que você não deseja que sejam automaticamente pluralizadas a esta definição:

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

3

A convenção de nomenclatura de controladores em Rails favorece a pluralização da última palavra no nome do controlador, embora não seja estritamente necessária (por exemplo ApplicationController).

Por exemplo, ClientsControlleré preferível a ClientController, SiteAdminsControlleré preferível a SiteAdminController ou SitesAdminsController, e assim por diante.

Seguir esta convenção permitirá que você use os geradores de rota padrão (por exemplo, recursos, etc) sem a necessidade de qualificar cada um :pathou :controller, e manterá o uso de ajudantes de URL e caminho consistente em toda a sua aplicação.

Ref: Convenção de Nomenclatura de Controladores - Documento Rails



2

Se o controlador for um recurso, deve ser plural ...

Por exemplo

Controlador

articles_controller.rb

Modelo

article.rb

Mas você pode usar nomes de controladores singulares quando não tiver modelos correspondentes como

welcome_controller.rb

1

Usar plurais soa melhor, e se você tiver um controlador que lida com um recurso singular, ou seja, usuário, você ainda pode nomear a url / usuário.

Com os ajudantes, muitas vezes não há necessidade de ter um ajudante para cada controlador, e muitas vezes haverá métodos auxiliares que você pode usar ascorss múltiplos controladores e, em vez disso, espalhar todos eles por meio de seu auxiliar de aplicativo, você pode colocá-los em ajudantes personalizados, como por exemplo, layout_helper ou qualquer outro arquivo bem nomeado.


Mesmos comentários de Can Berk Guder. Além disso, tive alguns problemas para seguir sua última frase / parágrafo porque havia tão pouca pontuação!
allyourcode

1
Desculpe por isso, tudo o que eu quis dizer é que pode ser uma ideia melhor criar helpers personalizados em vez de usar os padrões, já que os nomes dos padrões nem sempre capturam totalmente onde eles serão usados. Se você tiver vários métodos auxiliares que serão usados ​​para layout, chame-o de layout_helper.
nitecoder
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.