Rails'de tekil veya çoğul denetleyici ve yardımcı isimler


112

Denetleyiciler ve yardımcılar için tekil isimler kullanmanın herhangi bir dezavantajı var mı? Hiçbir şey buna güvenmiyor gibi görünüyor. Hatta en azından benim sınırlı deneyime göre, yardımcıların tekil ve çoğul konusunda karşılık gelen kontrolörlerle aynı seçimi yapmaları gerekmiyor gibi görünüyor. Bu doğru mu?


2
Tekil veya çoğul denetleyici adlarına karar vermeye çalışırken aynı ikilemi yaşadım!
Andrew

15
teşekkürler :) Rails kültürü böyle şeyleri sorgularsan kendini aptal hissettirecek bir yola sahiptir.
allyourcode

Yanıtlar:


158

Kesinlikle çoğul .

Dinlendirici yönlendirme ve tekil bir denetleyici ile

Denetleyici:

dog_controller.rb  

Yollar:

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

Çoğul bir denetleyici kullanma

Denetleyici:

dogs_controller.rb

Yollar:

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

rails generate controller --help çoğul örnekleri vardır:

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
kabul. Denetleyiciler için Rails 3.1 oluşturucu yardım mesajının örnek olarak "CreditCard" (tekil) kullanması kafa karıştırıcı.
56'da bantic

4
Rails yardımında artık çoğul kullanılıyor: raylar denetleyici oluşturuyor Kredi
Kartları



Yani adlandırma çoğul olmalı ve büyük / küçük harfle gelmelidir. örneğin: raylar denetleyici oluşturur Köpekler yeni dizin oluştur sil yok et düzenle "??
BKSpurgeon

27

Denetleyiciler için çoğul adlar kullanmak sadece bir kuraldır.

Çoğul adlar genellikle kulağa daha doğal gelir (özellikle doğrudan belirli bir modele bağlı denetleyiciler için: Kullanıcı -> Kullanıcılar, vb.), Ancak istediğinizi kullanabilirsiniz.

Yardımcılara gelince, tüm yardımcılar varsayılan olarak tüm denetleyiciler için mevcuttur, bu nedenle teknik olarak yardımcılarınızı nasıl adlandırdığınız hiç önemli değil. Bir denetleyicinin yardımcı işlevlerini denetleyiciyle aynı ada sahip bir yardımcıda tutmak başka bir kuraldır.


10
Kullanıcıya karşılık gelen denetleyicinin UserController olması daha doğal olmaz mıydı ?? Ayrıca, varsayılan rotalara güvenirseniz, tüm kullanıcıları düzenliyormuşsunuz gibi görünen / users / edit gibi görünen url'ler alırsınız. Bana göre bu hiç de doğal değil.
allyourcode

5
@allyourcode: iyi, sanırım hepsi öznel. bana göre, / users listesinin tüm kullanıcıları listelemesi / user seçeneğinden daha doğaldır.
Can Berk Güder

1
oh, ve bu RESTful yol.
Can Berk Güder

3
@ "RESTful yol" bir kült ilahisi gibi gelebilir. Rails genel olarak oldukça dindar olduğu için bu beni gerçekten şaşırtmadı. Rails'in REST konusunda takıntılı olmasını seviyorum, ancak varsayılan rotalar rahat değil. RESTful rotalarını yapılandırmak bile doğal değildir. Koşullar => {: method =>: post} dahil karma akım kuralla eşleşen isteği nasıl işleneceğini belirtmek gerekiyordu bağlanacağını modellerine ikinci argüman bir anlamı, değil ister herhangi bir istek Mevcut kuralı maçları .
allyourcode

2
@allyourcode göre bu yerine / kullanıcılar / düzenlemek id / düzenle: düzenlemek için varsayılan rota kullanıcılar / / olduğunu. "Tüm kullanıcılar arasından, kullanıcıyı id: id ile düzenle" demek bana tamamen doğal geliyor.
DavidG

19

Bir Model tekildir çünkü Kullanıcı gibi tek bir nesneye gönderme yapar. Bir denetleyici çoğuldur, çünkü Kullanıcıların koleksiyonuna yönelik denetimler (yöntemler). Yolların nasıl adlandırılacağı tamamen o geliştiriciye bağlıdır. Hiç bir kullanıcının bir web isteği URL'sinin tekil veya çoğul olduğundan şikayet etmemiştim. Nihai sonuç, son kullanıcılar için kaliteli sayfa gösterimleri veya API istekleri sunarken mevcut ve gelecekteki katkıda bulunanlar için ortak bir kural sağlamaktır.


12

Rails kılavuzlarında çok eksiksiz bir açıklamanız var: http://edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default


4
aslında bu doğru cevaptır, b / c eğer okursanız, çoğulun bir kaynak koleksiyonu için doğru cevap olduğunu açıklar. Tekil kaynak için tekil doğru cevaptır. Belgelerdeki örnekler. Ve aslında, bu diğer gönderide iyi yanıtlanmıştır: stackoverflow.com/questions/2614858/…
Rob

Bu yazıdaki gibi resmi referanslarla desteklenen cevaplar, yeni başlayanlara çok yardımcı oluyor! Teşekkürler
Wasif Hossain

9

Bu modelin bir veya daha fazla örneği çalışma zamanı sırasında varolabilir olsun, bir denetleyicinin bir modeli yönetmesi Rails kuraldır. Bununla birlikte, denetleyicilerin (ve ilişkili görünümlerin) herhangi bir belirli modelle ilişkili olmadığı, bunun yerine daha karmaşık bir işlevsellik kümesini işlediği bir Rails uygulamasına sahip olabilirsiniz. Bu durumda, otomatik çoğullaştırma herhangi bir anlam ifade etmiyor.

Şu anda üzerinde çalıştığım Rails uygulaması bu kategoriye uyuyor ve Rails'in bir yerde tekil olarak tanımladığım tanımlayıcıların daha sonra başka yerlerde çoğul formlarında kullanılmasını beklemesi beni rahatsız ediyor. Örneğin, şuna benzer bir şey tanımlamak isteyebilirim config/routes.rb:

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

ve sonra bir denetleyicinin DashboardControllerbirden fazla veritabanı tablosundan bilgi toplayarak uygulamanın belirli yönleriyle ilgili özet bilgileri görüntülemesini istiyorum . Yani burada, Dashboarduygulamanın herhangi bir modeline atıfta bulunulmuyor ve denetleyicinin adının olması garip olurdu DashboardsController.

Bu cevapta otomatik çoğullaşmanın tahrişine iyi bir çözüm buldum . Kısaca, dosyayı düzenleyin config/initializers/inflections.rbve otomatik olarak çoğul olmasını istemediğiniz kelimeleri bu tanıma ekleyin:

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

3

Rails'teki denetleyicilerin adlandırma kuralı, kesinlikle gerekli olmamakla birlikte denetleyicinin adındaki son sözcüğün çoğullaşmasını destekler (örn. ApplicationController).

Örneğin ClientsController, tercih edilir ClientController, SiteAdminsControllertercih edilir, SiteAdminController veya SitesAdminsController, vb.

Bu kongre sonrasında her nitelemek gerek kalmadan varsayılan rota jeneratörleri (örn kaynaklar vs.) kullanmanızı sağlayacak :pathya :controller, ve uygulama boyunca tutarlı bir URL ve yol Yardımcılarının kullanımını tutacak.

Ref: Denetleyici Adlandırma Kuralı-Rayları Belgesi



2

Denetleyici bir kaynaksa, çoğul olmalıdır ...

Örneğin

kontrolör

articles_controller.rb

model

article.rb

Ancak tekil denetleyici adlarını, aşağıdaki gibi karşılık gelen modellere sahip olmadığınızda kullanabilirsiniz.

welcome_controller.rb

1

Çoğulları kullanmak kulağa daha iyi geliyor ve tekil bir kaynağı, yani kullanıcıyı işleyen bir denetleyiciniz varsa, o zaman url / kullanıcıyı adlandırabilirsiniz.

Yardımcılarla, genellikle her denetleyici için bir yardımcıya sahip olmaya gerek yoktur ve çoğu zaman, birden fazla denetleyiciyi kullanabileceğiniz yardımcı yöntemler olacaktır ve bunların hepsini uygulama yardımcınız aracılığıyla dağıtabilirsiniz, bunları örneğin layout_helper veya herhangi biri gibi özel yardımcılara koyabilirsiniz. diğer iyi adlandırılmış dosya.


Can Berk Güder ile aynı yorumlar. Buna ek olarak, son cümlenizi / paragrafınızı takip ederken biraz sorun yaşadım çünkü çok az noktalama işareti vardı!
allyourcode

1
Bunun için üzgünüm, demek istediğim, varsayılanları kullanmak yerine özel yardımcılar oluşturmanın daha iyi bir fikir olabileceğiydi, çünkü varsayılanların adı her zaman kullanılacakları yeri tam olarak yakalamıyor. Düzen için kullanılacak çok sayıda yardımcı yönteminiz varsa, bunu layout_helper olarak adlandırın.
nitecoder
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.