Pengontrol tunggal atau jamak dan nama pembantu di Rails


112

Apakah ada kerugian menggunakan nama tunggal untuk pengontrol dan pembantu? Sepertinya tidak ada yang bergantung pada ini. Bahkan tampaknya pembantu tidak harus membuat pilihan yang sama tentang tunggal vs. jamak sebagai pengontrol yang sesuai, setidaknya menurut eksperimen terbatas saya. Benarkah itu?


2
Saya mengalami dilema yang sama ketika mencoba memutuskan nama pengontrol tunggal atau jamak!
Andrew

15
thanks :) Budaya rel punya cara untuk membuat Anda merasa bodoh jika mempertanyakan hal-hal seperti ini.
allyourcode

Jawaban:


158

Pasti jamak .

Dengan perutean yang tenang dan pengontrol tunggal

Pengontrol:

dog_controller.rb  

Rute:

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

Menggunakan pengontrol jamak

Pengontrol:

dogs_controller.rb

Rute:

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

rails generate controller --help memiliki contoh jamak:

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
sepakat. Ini membingungkan bahwa pesan bantuan generator Rails 3.1 untuk pengontrol menggunakan "CreditCard" (tunggal) sebagai contoh.
olok

4
Bantuan rel sekarang menggunakan jamak: rel menghasilkan pengontrol
Kartu

3
masih memiliki Kartu
Kredit

Bagaimana kita bisa menulis lokal untuk pengontrol tunggal stackoverflow.com/questions/29650094/…
santosh

Jadi penamaan harus jamak dan datang kasus. misalnya:: rel menghasilkan pengontrol Anjing indeks baru buat hapus hancurkan edit "??
BKSpurgeon

27

Menggunakan nama jamak untuk pengontrol hanyalah konvensi.

Nama jamak biasanya terdengar lebih natural (terutama untuk pengontrol yang terikat langsung ke model tertentu: Pengguna -> Pengguna, dll.), Tetapi Anda dapat menggunakan apa pun yang Anda inginkan.

Adapun pembantu, semua pembantu tersedia untuk semua pengontrol secara default, jadi secara teknis, bagaimana Anda memberi nama pembantu Anda tidak masalah sama sekali. Ini hanyalah konvensi lain untuk menyimpan fungsi helper pengontrol di helper dengan nama yang sama dengan pengontrol.


10
Bukankah lebih alami untuk pengontrol yang sesuai dengan User menjadi UserController ?? Selain itu, jika Anda mengandalkan rute default, Anda mendapatkan url yang terlihat seperti / users / edit, yang terlihat seperti Anda mengedit semua pengguna. Bagi saya, itu sama sekali tidak wajar.
allyourcode

5
@allyourcode: yah, saya rasa itu semua subjektif. bagi saya, memiliki / daftar pengguna semua pengguna lebih alami daripada / pengguna.
Can Berk Güder

1
oh, dan itu cara yang tenang.
Can Berk Güder

3
@Dapatkah "cara tenang" terdengar seperti nyanyian pemujaan. Itu tidak terlalu mengejutkan saya, karena Rails cukup religius secara keseluruhan. Saya suka bagaimana Rails semua terobsesi dengan REST, namun rute default tidak tenang. Bahkan mengonfigurasi rute RESTful pun tidak wajar. Menyertakan: condition => {: method =>: post} dalam argumen kedua untuk menghubungkan tidak masuk akal, karena hash seharusnya menentukan cara menangani permintaan apa pun yang cocok dengan aturan saat ini, bukan apakah ada permintaan yang sesuai dengan aturan saat ini .
allyourcode

2
@allyourcode Menurut ini , rute default untuk edit adalah / users /: id / edit, bukan / users / edit. Mengatakan "dari semua pengguna, edit pengguna dengan id: id" terdengar sangat wajar bagi saya.
DavidG

19

Model adalah tunggal karena mereferensikan satu objek seperti Pengguna. Kontroler bersifat jamak karena merupakan kontrol (metode) untuk kumpulan Pengguna. Bagaimana seseorang menamai rute tersebut tergantung pada pengembang individu itu. Saya tidak pernah memiliki pengguna yang mengeluh bahwa URL untuk permintaan web berbentuk tunggal atau jamak. Hasil akhirnya untuk mempertahankan konvensi umum untuk kontributor saat ini dan di masa depan sambil menyajikan tampilan halaman berkualitas atau permintaan API untuk pengguna akhir.


12

Anda memiliki penjelasan yang sangat lengkap di panduan Rails: http://edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default


4
sebenarnya ini adalah jawaban yang benar b / c jika dibaca, menjelaskan bahwa jamak adalah jawaban yang tepat untuk kumpulan sumber. Untuk sumber daya tunggal, bentuk tunggal adalah jawaban yang tepat. Contoh dalam dokumentasi. Dan sebenarnya, ini dijawab dengan baik di posting lain ini: stackoverflow.com/questions/2614858/…
Rob

Jawaban yang didukung oleh referensi resmi seperti di posting ini sangat membantu pemula! Terima kasih
Wasif Hossain

9

Ini adalah konvensi Rails bahwa satu pengontrol menangani satu model, apakah satu atau beberapa contoh model itu dapat ada selama runtime. Namun, Anda dapat memiliki aplikasi Rails di mana (beberapa) pengontrol (dan tampilan terkait) tidak terkait dengan model tertentu, melainkan menangani sekumpulan fungsionalitas yang lebih kompleks. Dalam kasus ini, pluralisasi otomatis tidak masuk akal.

Aplikasi Rails yang sedang saya kerjakan cocok dengan kategori ini, dan ini hanya mengganggu saya karena Rails mengharapkan bahwa pengidentifikasi yang saya definisikan sebagai satu tempat di satu tempat kemudian digunakan dalam bentuk jamak di tempat lain. Misalnya, saya mungkin ingin mendefinisikan sesuatu seperti ini di config/routes.rb:

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

dan kemudian saya ingin pengontrol DashboardControllermenampilkan informasi ringkasan tentang aspek tertentu dari aplikasi, mengumpulkan informasi dari lebih dari satu tabel database. Jadi di sini, Dashboardtidak mengacu pada model aplikasi apa pun, dan akan sangat aneh memiliki nama pengontrolnya DashboardsController.

Saya menemukan solusi yang baik untuk gangguan pluralisasi otomatis dalam jawaban ini . Singkatnya, edit file config/initializers/inflections.rbdan tambahkan kata yang tidak Anda inginkan menjadi jamak secara otomatis ke definisi ini:

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

3

Konvensi penamaan pengontrol di Rails mendukung pluralisasi kata terakhir dalam nama pengontrol, meskipun tidak benar-benar diperlukan (misalnya ApplicationController).

Misalnya, ClientsControllerlebih disukai daripada ClientController, SiteAdminsControllerlebih disukai daripada SiteAdminController atau SitesAdminsController, dan seterusnya.

Mengikuti konvensi ini akan memungkinkan Anda untuk menggunakan generator rute default (misalnya sumber daya, dll) tanpa harus memenuhi syarat masing :path- masing atau :controller, dan akan menjaga penggunaan URL dan jalur pembantu konsisten di seluruh aplikasi Anda.

Ref: Pengontrol Naming Convention-Rails Doc



2

Jika pengontrol adalah sumber daya maka itu harus jamak ...

Sebagai contoh

Kontroler

articles_controller.rb

Model

article.rb

Tetapi Anda dapat menggunakan nama pengontrol tunggal jika Anda tidak memiliki model yang sesuai seperti

welcome_controller.rb

1

Menggunakan bentuk jamak hanya terdengar lebih baik, dan kemudian jika Anda memiliki pengontrol yang menangani sumber tunggal, yaitu pengguna, maka Anda masih dapat memberi nama url / pengguna.

Dengan pembantu sering kali tidak perlu memiliki pembantu untuk setiap pengontrol, dan seringkali akan ada metode pembantu Anda dapat menggunakan beberapa pengontrol ascors dan lebih baik membuang semuanya melalui pembantu aplikasi Anda, Anda dapat meletakkannya di pembantu khusus sebagai gantinya seperti misalnya layout_helper atau apapun file bernama baik lainnya.


Komentar yang sama untuk Can Berk Guder. Selain itu, saya kesulitan mengikuti kalimat / paragraf terakhir Anda karena tanda baca sangat sedikit!
allyourcode

1
Maaf tentang itu, yang saya maksud adalah bahwa mungkin ide yang lebih baik untuk membuat pembantu khusus daripada menggunakan default karena nama default tidak selalu menangkap sepenuhnya di mana mereka akan digunakan. Jika Anda memiliki sejumlah metode pembantu yang akan digunakan untuk layout, beri nama layout_helper.
nitecoder
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.