Merutekan dengan Dash `-` Alih-alih Underscore` _` di Ruby on Rails

88

Saya ingin url saya menggunakan tanda hubung -alih-alih garis bawah _sebagai pemisah kata. Misalnya, controller/my-actionbukan controller/my_action.

Saya terkejut tentang dua hal:

  1. Google dkk. terus bedakan mereka.
  2. Itu Ruby on Rails tidak memiliki sederhana, parameter konfigurasi global untuk memetakan -ke _dalam routing. Atau apakah itu?

Solusi terbaik yang pernah saya gunakan adalah menggunakan :asatau rute bernama.

Ide saya adalah untuk memodifikasi Rails routing ke memeriksa bahwa konfigurasi global dan perubahan -untuk _sebelum pengiriman ke aksi kontroler.

Apakah ada cara yang lebih baik?

pduey
sumber
Saya juga lebih suka tanda hubung ke garis bawah di url (serta di id elemen html / css, nama, dan kelas), tetapi saya belum mencoba menerapkannya. Saya akan bermigrasi ke rails 3 terlebih dahulu dan kemudian mengkhawatirkan hal ini karena rails 3 memiliki banyak peningkatan drastis ke middleware dan perutean.
yfeldblum
Terima kasih, Justice. Saya akan menunggu sampai saya mengupgrade dan terbiasa dengan v3.
pduey
Lihat artikel ini tentang Rute dengan Tanda Hubung di Rel
Yarin

Jawaban:

74

Dengan Rails 3 dan yang lebih baru, Anda dapat melakukan seperti ini:

resources :user_bundles, :path => '/user-bundles'

Pilihan lainnya adalah memodifikasi Rails, melalui penginisialisasi. Saya tidak merekomendasikan ini, karena mungkin rusak di versi mendatang (edit: tidak berfungsi di Rails 5).

Menggunakan :pathseperti yang ditunjukkan di atas lebih baik.

# Using private APIs is not recommended and may break in future Rails versions.
# https://github.com/rails/rails/blob/4-1-stable/actionpack/lib/action_dispatch/routing/mapper.rb#L1012
#
# config/initializers/adjust-route-paths.rb
module ActionDispatch
  module Routing
    class Mapper
      module Resources
        class Resource
          def path
            @path.dasherize
          end
        end
      end
    end
  end
end
batu pasir
sumber
1
Saya baru mengenal Rails. File apa yang ingin Anda tambahkan baris seperti ini?
Alan W. Smith
5
harus ada cara yang lebih baik dan lebih cepat untuk mengonversi semua rute yang memiliki garis bawah ke tanda hubung
carbonr
2
@carbonr bagaimana dengan contoh yang baru saja saya tambahkan? :)
badai pasir mulai
@sandrom itu saja! manis!
carbonr
3
Sayangnya patch monyet ini tidak lagi berfungsi di Rails 5. Ini akan mengurangi segalanya kecuali #index dan #create, yang akan tetap sebagai garis bawah dan membuat bug yang tidak menyenangkan. Jika ada yang memiliki skrip yang diperbarui untuk Rails 5, itu akan sangat dihargai.
Kelsey Hannan
4

Anda dapat membebani pengontrol dan nama tindakan untuk menggunakan tanda hubung:

# config/routes.rb
resources :my_resources, path: 'my-resources' do
  collection do
    get 'my-method', to: :my_method
  end
end

Anda dapat menguji di konsol:

rails routes -g my_resources
my_method_my_resources GET  /my-resources/my-method(.:format) my_resources#my_method
Lev Lukomsky
sumber
2

Anda dapat menggunakan rute bernama. Ini akan memungkinkan penggunaan '-' sebagai pemisah kata. Di routes.rb,

map.name_of_route     'a-b-c',       :controller => 'my_controller', :action => "my_action"

Sekarang url seperti http: // my_application / abc akan menuju ke controller dan action yang ditentukan.

Juga, untuk membuat url dinamis

map.name_of_route    'id1-:id2-:id3',       :controller => 'my_controller', :action => "my_action"

dalam hal ini 'id1, id2 & id2 akan diteruskan sebagai http params ke tindakan

Dalam tindakan dan pandanganmu,

name_of_route_url(:id1=>val1, :id2=>val2, :id3=>val3) 

akan mengevaluasi ke url ' http: // my_application / val1-val2-val3 '.

Kan
sumber
3
Saya ingin menghindari pemeliharaan manual dari perutean, jadi rute bernama keluar. Saya hanya ingin perutean rel melakukan penggantian untuk saya secara grosir dan menyimpan file konfigurasi saya dengan ketat.
pduey
2

jika Anda menggunakan garis bawah di pengontrol dan melihat file maka cukup gunakan tanda hubung di file rute Anda, dan itu akan berfungsi ..

dapatkan 'blog / example-text' ini adalah rute saya untuk pengontrol ini

def example_text end <- ini adalah pengontrol saya

dan example_text.html.erb adalah filenya

dan ini adalah tautan sebenarnya site.com/blog/example-text

Saya pikir ini berhasil untuk saya, dan itu lebih efektif daripada menggarisbawahi SEO

neinx
sumber