Pojedyncze lub mnogie nazwy kontrolerów i pomocników w Railsach

112

Czy jest jakaś wada używania pojedynczych nazw kontrolerów i pomocników? Wydaje się, że nic na tym nie polega. Wydaje się nawet, że pomocnicy nie muszą dokonywać takiego samego wyboru między liczbą pojedynczą a liczbą mnogą, jak odpowiadający im kontrolerzy, przynajmniej zgodnie z moimi ograniczonymi eksperymentami. Czy to prawda?

allyourcode
źródło
2
Miałem ten sam dylemat, próbując zdecydować o liczbie pojedynczej lub mnogiej nazw kontrolerów!
Andrew,
15
dzięki :) Kultura Railsów może wprawiać cię w głupotę, jeśli kwestionujesz takie rzeczy.
allyourcode

Odpowiedzi:

158

Zdecydowanie liczba mnoga .

Z spokojnym routingiem i pojedynczym kontrolerem

Kontroler:

dog_controller.rb  

Trasy:

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

Używanie kontrolera w liczbie mnogiej

Kontroler:

dogs_controller.rb

Trasy:

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

rails generate controller --help ma wiele przykładów:

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
źródło
23
Zgoda. To mylące, że komunikat pomocy generatora Rails 3.1 dla kontrolerów używa jako przykładu „CreditCard” (liczba pojedyncza).
bantic
4
Pomoc Rails używa teraz liczby mnogiej:
railsy
3
nadal ma tutaj pojedynczą kartę
rcrogers
Jak możemy pisać lokalizacje dla pojedynczego kontrolera stackoverflow.com/questions/29650094/ ...
santosh
Więc nazewnictwo powinno być w liczbie mnogiej i przyszło. np .::
railsy
27

Używanie nazw liczby mnogiej dla kontrolerów to tylko konwencja.

Nazwy w liczbie mnogiej zwykle brzmią bardziej naturalnie (szczególnie w przypadku kontrolerów, które są bezpośrednio powiązane z określonym modelem: Użytkownik -> Użytkownicy itp.), Ale możesz użyć tego, co chcesz.

Jeśli chodzi o pomocników, wszyscy pomocnicy są domyślnie dostępni dla wszystkich kontrolerów, więc technicznie rzecz biorąc, sposób nazywania pomocników nie ma żadnego znaczenia. Inną konwencją jest utrzymywanie funkcji pomocniczych kontrolera w helperach o tej samej nazwie co kontroler.

Czy Berk Güder
źródło
10
Czy nie byłoby bardziej naturalne, gdyby kontroler odpowiadający użytkownikowi był kontrolerem użytkownika? Ponadto, jeśli polegasz na domyślnych trasach, otrzymasz adresy URL, które wyglądają jak / users / edit, co wygląda na to, że edytujesz wszystkich użytkowników. Dla mnie to wcale nie jest naturalne.
allyourcode
5
@allyourcode: cóż, myślę, że to wszystko jest subiektywne. dla mnie posiadanie / users listy wszystkich użytkowników jest bardziej naturalne niż / user.
Can Berk Güder
1
och, i to RESTful sposób.
Can Berk Güder
3
@Can „the RESTful way” brzmi jak kultowa pieśń. Nie jest to jednak dla mnie zaskoczeniem, ponieważ Rails jest ogólnie dość religijny. Podoba mi się, że Railsy mają obsesję na punkcie REST, ale domyślne trasy nie są spokojne. Nawet konfigurowanie tras RESTful jest nienaturalne. Uwzględnianie: conditions => {: method =>: post} w drugim argumencie do połączenia nie ma sensu, ponieważ hash ma określać, jak obsłużyć każde żądanie, które pasuje do bieżącej reguły, a nie czy dane żądanie pasuje do bieżącej reguły .
allyourcode
2
@allyourcode Zgodnie z tym domyślną trasą edycji jest / users /: id / edit zamiast / users / edit. Powiedzenie „spośród wszystkich użytkowników edytuj użytkownika o identyfikatorze: id” brzmi dla mnie zupełnie naturalnie.
DavidG,
19

Model jest pojedynczy, ponieważ odwołuje się do pojedynczego obiektu, takiego jak User. Kontroler jest w liczbie mnogiej, ponieważ jest to kontrolki (metody) dla kolekcji użytkowników. To, jak nazwać trasy, zależy od tego konkretnego programisty. Nigdy nie spotkałem użytkownika narzekającego, że adres URL żądania internetowego jest w liczbie pojedynczej lub mnogiej. Efektem końcowym jest zachowanie wspólnej konwencji dla obecnych i przyszłych współpracowników podczas obsługi jakości wyświetlania stron lub żądań API dla użytkowników końcowych.

Ryan
źródło
12

Masz bardzo pełne wyjaśnienie w przewodnikach Rails: http://edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default

Nerian
źródło
4
w rzeczywistości jest to właściwa odpowiedź b / c, jeśli ją przeczytasz, wyjaśnia, że ​​liczba mnoga jest właściwą odpowiedzią dla zbioru zasobów. W przypadku pojedynczego zasobu poprawną odpowiedzią jest liczba pojedyncza. Przykłady w dokumentacji. I faktycznie, odpowiedź na to pytanie znajduje się w tym innym poście: stackoverflow.com/questions/2614858/…
Rob
Odpowiedzi poparte oficjalnymi odniesieniami, jak w tym poście, bardzo pomagają początkującym! Dziękuję
Wasif Hossain,
9

Zgodnie z konwencją Railsów jeden kontroler obsługuje jeden model, niezależnie od tego, czy jedna lub więcej instancji tego modelu może istnieć w czasie wykonywania. Możesz jednak mieć aplikację Railsową, w której (niektóre) kontrolery (i powiązane z nimi widoki) nie są powiązane z żadnym konkretnym modelem, ale raczej obsługują bardziej złożony zestaw funkcji. W tym przypadku automatyczna liczba mnoga nie ma sensu.

Aplikacja Rails, nad którą obecnie pracuję, mieści się w tej kategorii i jest dla mnie po prostu irytacją, że Railsy oczekuje, że identyfikatory, które określam jako liczbę pojedynczą w jednym miejscu, są następnie używane w liczbie mnogiej w innych miejscach. Na przykład mógłbym chcieć zdefiniować coś takiego w config/routes.rb:

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

a następnie chcę, aby kontroler DashboardControllerwyświetlał podsumowanie informacji o niektórych aspektach aplikacji, zbierając informacje z więcej niż jednej tabeli bazy danych. Więc tutaj Dashboardnie odnosi się do żadnego modelu aplikacji i byłoby po prostu dziwne, gdyby nazwa kontrolera brzmiała DashboardsController.

Znalazłem dobre rozwiązanie problemu irytacji automatycznej liczby mnogiej w tej odpowiedzi . Krótko mówiąc, edytuj plik config/initializers/inflections.rbi dodaj słowa, których nie chcesz automatycznie tworzyć liczby mnogiej do tej definicji:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable %w( dashboard foo bar baz )
end
Teemu Leisti
źródło
3

Konwencja nazewnictwa kontrolerów w Railsach faworyzuje liczbę mnogą ostatniego słowa w nazwie kontrolera, chociaż nie jest to ściśle wymagane (np ApplicationController.).

Na przykład, ClientsControllerkorzystne jest ClientController, SiteAdminsControllerkorzystne jest, aby SiteAdminController i SitesAdminsController, i tak dalej.

W następstwie tej konwencji będzie można korzystać z domyślnych generatorów trasy (np zasobów, etc) bez konieczności zakwalifikowania każdej :pathlub :controller, i będzie wykorzystywany URL i ścieżka pomocników spójne w całej aplikacji.

Ref: Konwencja nazewnictwa kontrolerów - Rails Doc

Mukesh Singh Rathaur
źródło
2

Czuję się lepiej, gdy używam liczby pojedynczej dla nazwy kontrolera

Dillone Hailei Wang
źródło
2

Jeśli kontroler jest zasobem, musi być w liczbie mnogiej ...

Na przykład

Kontroler

articles_controller.rb

Model

article.rb

Ale możesz użyć pojedynczych nazw kontrolerów, gdy nie masz odpowiednich modeli, takich jak

welcome_controller.rb

źródło
1

Używanie liczby mnogiej brzmi po prostu lepiej, a jeśli masz kontroler obsługujący pojedynczy zasób, np. Użytkownika, nadal możesz nazwać adres URL / użytkownika.

Z pomocnikami często nie ma potrzeby posiadania pomocnika dla każdego kontrolera i często będą metody pomocnicze, możesz użyć ascorsów wielu kontrolerów i raczej zaśmiecać je wszystkie za pomocą pomocnika aplikacji, możesz umieścić je w niestandardowych pomocnikach, takich jak np. Layout_helper lub inne inny dobrze nazwany plik.

nitecoder
źródło
Te same uwagi, co w przypadku Can Berk Guder. Ponadto miałem problemy ze zrozumieniem Twojego ostatniego zdania / akapitu, ponieważ było tak mało znaków interpunkcyjnych!
allyourcode
1
Przepraszam za to, chodziło mi tylko o to, że lepszym pomysłem może być tworzenie niestandardowych pomocników niż używanie domyślnych, ponieważ nazwy domyślnych nie zawsze w pełni przechwytują miejsce, w którym będą używane. Jeśli masz kilka metod pomocniczych, które będą używane do układu, nazwij je layout_helper.
nitecoder