Controller singolare o plurale e nomi di supporto in Rails


112

C'è qualche svantaggio nell'usare nomi singolari per controller e helper? Niente sembra fare affidamento su questo. Sembra persino che gli helper non debbano fare la stessa scelta tra singolare e plurale dei controllori corrispondenti, almeno secondo la mia limitata sperimentazione. È vero?


2
Ho avuto lo stesso dilemma cercando di decidere su nomi di controller singolari o plurali!
Andrew

15
grazie :) La cultura di Rails ha un modo di farti sentire stupido se metti in dubbio cose come questa.
allyourcode

Risposte:


158

Decisamente plurale .

Con un percorso riposante e un controller unico

controller:

dog_controller.rb  

Itinerari:

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

Utilizzando un controller plurale

controller:

dogs_controller.rb

Itinerari:

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

rails generate controller --help ha esempi plurali:

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
concordato. È fonte di confusione che il messaggio di aiuto del generatore di Rails 3.1 per i controller utilizzi "CreditCard" (singolare) come esempio.
bantic

4
La guida di Rails ora utilizza il plurale: rails genera il controller CreditCards apre debit credit close
notapatch

3
ha ancora la singolare CreditCard qui: guides.rubyonrails.org/command_line.html#rails-generate
rcrogers

Come possiamo scrivere locali per singolare regolatore stackoverflow.com/questions/29650094/...
Santosh

Quindi la denominazione dovrebbe essere plurale e dovrebbe essere maiuscola. es:: rails genera controller Dogs nuovo indice crea cancella distruggi modifica "??
BKSpurgeon

27

L'uso di nomi plurali per i controller è solo una convenzione.

I nomi plurali di solito suonano più naturali (specialmente per i controller che sono legati direttamente a un modello specifico: Utente -> Utenti, ecc.), Ma puoi usare quello che vuoi.

Per quanto riguarda gli helper, tutti gli helper sono disponibili per tutti i controller per impostazione predefinita, quindi tecnicamente, il modo in cui si nominano gli helper non ha alcuna importanza. È solo un'altra convenzione mantenere le funzioni di supporto di un controller in un helper con lo stesso nome del controller.


10
Non sarebbe più naturale che il controller corrispondente a User fosse l'UserController? Inoltre, se ti affidi alle route predefinite, ottieni URL che assomigliano a / users / edit, che sembra che tu stia modificando tutti gli utenti. Per me, questo non è affatto naturale.
allyourcode

5
@allyourcode: beh, immagino sia tutto soggettivo. per me, avere / users elenca tutti gli utenti è più naturale di / user.
Can Berk Güder

1
oh, ed è il modo RIPOSO.
Can Berk Güder

3
@Can "the RESTful way" suona come un canto di culto. Ciò non mi sorprende davvero, dato che Rails è piuttosto religioso nel complesso. Mi piace come Rails sia ossessionato da REST, ma le rotte predefinite non sono riposanti. Anche la configurazione delle rotte RESTful è innaturale. Includere: condition => {: method =>: post} nel secondo argomento per connettersi non ha senso, poiché si suppone che l'hash specifichi come gestire qualsiasi richiesta che corrisponde alla regola corrente, non se una determinata richiesta corrisponde alla regola corrente .
allyourcode

2
@allyourcode Secondo questo il percorso predefinito per la modifica è / users /: id / edit invece di / users / edit. Dire "tra tutti gli utenti, modifica l'utente con id: id" mi sembra perfettamente naturale.
DavidG

19

Un modello è singolare perché fa riferimento a un singolo oggetto come Utente. Un controller è plurale perché sono i controlli (metodi) per la raccolta degli utenti. Il modo in cui si nominano le rotte dipende tutto da quel singolo sviluppatore. Non ho mai avuto un utente che si lamentasse del fatto che un URL per una richiesta web sia singolare o plurale. Il risultato finale è quello di mantenere una convenzione comune per i contributori attuali e futuri durante la pubblicazione di pagine di qualità o richieste API per gli utenti finali.


12

Hai una spiegazione molto completa nelle guide di Rails: http://edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default


4
in effetti questa è la risposta giusta b / c se la leggi, spiega che il plurale è la risposta giusta per una raccolta di risorse. Per una risorsa singleton, singolare è la risposta giusta. Esempi nella documentazione. E in realtà, questo è ben risposto in questo altro post: stackoverflow.com/questions/2614858/…
Rob il

Le risposte supportate da riferimenti ufficiali come in questo post aiutano molto i neofiti! Grazie
Wasif Hossain

9

È la convenzione di Rails che un controller gestisca un modello, indipendentemente dal fatto che una o più istanze di quel modello possano esistere durante il runtime. Tuttavia, puoi avere un'applicazione Rails in cui (alcuni) i controller (e le viste associate) non sono associati a nessun modello particolare, ma gestiscono piuttosto un insieme più complesso di funzionalità. In questo caso, la pluralizzazione automatica non ha alcun senso.

L'applicazione Rails su cui sto attualmente lavorando rientra in questa categoria, ed è semplicemente irritante per me che Rails si aspetti che gli identificatori che definisco singolari in un punto vengano poi utilizzati nella loro forma plurale in altri luoghi. Ad esempio, potrei voler definire qualcosa di simile in config/routes.rb:

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

quindi desidero che un controller DashboardControllervisualizzi informazioni di riepilogo su determinati aspetti dell'applicazione, raccogliendo informazioni da più di una tabella di database. Quindi qui, Dashboardnon si riferisce a nessun modello dell'applicazione e sarebbe semplicemente strano avere il nome del controller DashboardsController.

Ho trovato una buona soluzione all'irritazione del pluralismo automatico in questa risposta . In breve, modifica il file config/initializers/inflections.rbe aggiungi le parole che non vuoi che siano automaticamente pluralizzate a questa definizione:

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

3

La convenzione di denominazione dei controller in Rails favorisce la pluralizzazione dell'ultima parola nel nome del controller, sebbene non sia strettamente richiesta (ad esempio ApplicationController).

Ad esempio, ClientsControllerè preferibile a ClientController, SiteAdminsControllerè preferibile a SiteAdminController o SitesAdminsController, e così via.

Seguire questa convenzione ti consentirà di utilizzare i generatori di route predefiniti (ad esempio risorse, ecc.) Senza la necessità di qualificare ciascuno :patho :controller, e manterrà coerente l'utilizzo di URL e path helper in tutta l'applicazione.

Rif: Controller Naming Convention-Rails Doc



2

Se il controller è una risorsa, deve essere plurale ...

Per esempio

controllore

articles_controller.rb

Modello

article.rb

Ma puoi usare nomi di controller singolari quando non hai modelli corrispondenti come

welcome_controller.rb

1

Usare i plurali suona semplicemente meglio, e quindi se hai un controller che gestisce una risorsa singolare, cioè utente, puoi ancora nominare l'url / utente.

Con gli helper spesso non è necessario avere un helper per ogni controller, e spesso ci saranno metodi helper che puoi usare ascors controller multipli e piuttosto spargerli tutti attraverso il tuo helper dell'applicazione potresti metterli in helper personalizzati invece come ad esempio layout_helper o qualsiasi altro file ben denominato.


Stessi commenti di Can Berk Guder. Inoltre, ho avuto qualche problema a seguire la tua ultima frase / paragrafo perché c'era così poca punteggiatura!
allyourcode

1
Mi dispiace, tutto quello che volevo dire era che potrebbe essere un'idea migliore creare helper personalizzati piuttosto che utilizzare i valori predefiniti poiché il nome di quelli predefiniti non sempre cattura completamente dove verranno utilizzati. Se hai un numero di metodi di supporto che verranno utilizzati per il layout, chiamalo layout_helper.
nitecoder
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.