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.
param
opsi untuk rel 3: gist.github.com/sj26/44ef47fe8b98b46ee32dpost_slug
, yang mungkin membingungkan.di Rails 4, berikan opsi param untuk mengubah: id params. Misalnya
resources :photos, param: :photo_name
akan menghasilkan / photos /: photo_namesumber
Jika saya memahami Anda dengan benar, yang Anda inginkan adalah memiliki
client_name
alih - alihid
di url Anda, bukan?Anda dapat melakukannya dengan mengganti
to_param
metode dalam model Anda. Anda dapat memperoleh informasi lebih lanjut di sini .sumber
Ada permata untuk itu, sama seperti permata untuk segalanya;)
Saya telah menggunakan FriendlyId untuk perilaku semacam ini di rel 3.
Ini akan meminta Anda untuk menambahkan beberapa kode ke model Anda, seperti ini:
... dan jika klien Anda tidak memiliki nama yang kompatibel dengan URI, Anda mungkin ingin menggunakan slug untuk itu, yang dapat Anda lakukan dengan
has_friendly_id :name, :use_slug => true
. Saat menggunakan siput, Anda jelas harus menyimpannya ke database juga.Dan seperti yang telah disebutkan, Anda masih bisa menggunakan
to_param
trik dengan rel 3, seperti yang didokumentasikan di sini . Saya menemukan FriendlyId sedikit lebih fleksibel.sumber
to_param
, tetapi itu melakukan beberapa hal pintar lainnya di latar belakang juga. Saya menemukan tautannya di sini: stackoverflow.com/questions/4744446/…to_param
merusak bagian depan aplikasi saya. Sebenarnya saya sangat mencari pendekatan perutean adalah saya telah mengubah API saya tetapi tanpa memutus bagian Model dan Frontend dari aplikasi. Mengapa saya tidak bisa hanya memodifikasi rute saja seperti yang saya nyatakan dan contoh posting untuk versi rel yang lebih lama di atas ???@client = Client.find(:name => param[:client_name]
diClientsController#show
? Itu mungkin berhasil.Client.where(:name => param[:client_name]).first
, itu adalah.Di Rails 3 Anda dapat mengganti nama kunci id dengan menggunakan kombinasi namespace dan cakupan seperti ini (meskipun tidak terlalu bagus):
sumber