Rel 4 & 5
Di Rails 4, :param
opsi telah ditambahkan, yang tampaknya melakukan apa yang Anda cari. Anda dapat melihat kode Rails 3 dibandingkan dengan kode Rails 4 .
Detail
Anda dapat dengan mudah menerapkan ini di routes.rb
file Anda :
# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
Sejak rilis Rails 4, fungsionalitas ini didokumentasikan di Panduan Rails .
Rel 3
Sayangnya, di Rails 3, :key
opsi untuk resources
telah dihapus, sehingga Anda tidak dapat lagi dengan mudah mengubah nama untuk rute yang dibuat dengan cara ini hanya dengan memasukkan opsi tambahan.
Detail
Saya berasumsi bahwa Anda entah bagaimana sudah mendapatkan aplikasi yang berfungsi seperti yang Anda inginkan pada tahun lalu, tetapi saya akan membahas cara untuk mendapatkan efek yang Anda gambarkan di Rails 3 in routes.rb
. Ini hanya akan melibatkan sedikit lebih banyak pekerjaan daripada to_param
metode. Anda masih dapat menentukan parameter khusus dalam rute didefinisikan menggunakan scope
dan match
(atau sepupu itu get
, put
, post
, dan delete
). Anda cukup menulis nama parameter yang Anda inginkan di matcher:
get 'clients/:client_name', :to => 'clients#show', :as => client
scope 'clients/:client_name' do
get 'sites/:name', :to => 'sites#show', :as => site
end
Anda harus menambahkan semua rute yang dibuat resources
secara otomatis untuk Anda secara manual , tetapi itu akan mencapai apa yang Anda cari. Anda juga dapat secara efektif menggunakan :controller
opsi dengan scope
dan scope
blok tambahan untuk menghilangkan beberapa pengulangan.
EDIT (8 Mei 2014): Buat lebih jelas bahwa jawaban berisi informasi untuk Rails 3 & 4. Perbarui tautan ke kode untuk pergi ke nomor baris yang tepat dan komit sehingga mereka harus bekerja untuk jangka waktu yang lebih lama.
EDIT (Nov 16, 2014): Rails 4 harus berada di atas sekarang dan menyertakan informasi yang relevan karena ini adalah versi Rails saat ini untuk beberapa waktu sekarang.
EDIT (Agustus 9, 2016): Merefleksikan bahwa solusinya masih berfungsi di Rails 5, dan perbarui tautan lama.