Percorsi con trattino `-` invece di trattino basso` _` in Ruby on Rails


88

Voglio che i miei URL utilizzino il trattino -invece del trattino basso _come separatori di parole. Ad esempio controller/my-actioninvece di controller/my_action.

Sono sorpreso di due cose:

  1. Google et al. continuare a distinguerli.
  2. Che Ruby on Rails non ha una semplice, parametro di configurazione globale per mappare -a _nel routing. Oppure sì?

La migliore soluzione che ho è quella di utilizzare :aso una rotta denominata.

La mia idea è di modificare il routing di Rails per verificare la configurazione globale e passare -a _prima di inviare a un'azione del controller.

Esiste un modo migliore?


Preferisco anche i trattini ai trattini bassi negli URL (così come negli id, nei nomi e nelle classi degli elementi HTML / CSS), ma non ho provato a implementarlo. Migrerei prima a rails 3 e poi mi preoccuperei di questo perché rails 3 ha molti aggiornamenti drastici al middleware e al routing.
yfeldblum

Grazie giustizia. Aspetterò finché non avrò aggiornato e acquisito familiarità con v3.
pduey

Vedi questo articolo sui percorsi con
trattino

Risposte:


74

Con Rails 3 e versioni successive puoi fare così:

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

Un'altra opzione è modificare Rails, tramite un inizializzatore. Non lo consiglio però, poiché potrebbe non funzionare nelle versioni future (modifica: non funziona in Rails 5).

Usare :pathcome mostrato sopra è meglio.

# 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

1
Sono nuovo di zecca su Rails. In quale file aggiungeresti una riga come questa?
Alan W. Smith

5
ci deve essere un modo migliore e più veloce per convertire in trattini tutte le rotte con meno
carbonr

2
@carbonr che ne dici dell'esempio che ho appena aggiunto? :)
sandstrom

@sandstrom questo è tutto! dolce!
carbonr

3
Purtroppo questa patch scimmia non funziona più in Rails 5. Ciò dasherize tutto tranne #index e #create, che rimarranno come sottolineatura e creeranno brutti bug. Se qualcuno ha uno script aggiornato per Rails 5, sarebbe molto apprezzato.
Kelsey Hannan

4

Puoi sovraccaricare i nomi di controller e azioni per utilizzare i trattini:

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

Puoi testare in console:

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

2

Puoi usare percorsi con nome. Consentirà di utilizzare "-" come separatori di parole. In route.rb,

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

Ora gli URL come http: // my_application / abc andrebbero al controller e all'azione specificati.

Inoltre, per creare URL dinamici

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

in questo caso 'id1, id2 e id2 sarebbero passati come parametri http all'azione

Nelle tue azioni e visualizzazioni,

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

restituirebbe l' URL " http: // my_application / val1-val2-val3 ".


3
Voglio evitare la manutenzione manuale del routing, quindi le rotte denominate sono fuori. Voglio solo che il routing rails faccia la sostituzione per me all'ingrosso e mantenga i miei file di configurazione stretti.
pduey

2

se usi i trattini bassi in un controller e visualizzi il file, usa semplicemente i trattini nel file delle rotte e funzionerà ..

ottenere 'blog / esempio-testo' questo è il mio percorso per questo controller

def example_text end <- questo è il mio controller

e example_text.html.erb è il file

e questo è il link effettivo site.com/blog/example-text

Ho pensato che questo funziona per me, ed è più efficace delle sottolineature SEO saggio

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.