Tutte queste soluzioni utilizzano find_by_name
, che richiederebbe sicuramente un indice su tale colonna e richiedono che siano univoci. Una soluzione migliore che abbiamo usato, sacrificando una piccola quantità di bellezza, è quella di usare il prefisso del nome del venditore con il suo ID. Ciò significa che non è necessario avere un indice sulla colonna del nome e/o richiedere unicità.
vendor.rb
def to_param
normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '')
"#{self.id}-#{normalized_name}"
end
Quindi questo darebbe URL come
/1-Acme
/19-Safeway
ecc
Poi, nel vostro show azione che è ancora possibile utilizzare
Vendor.find(params[:id])
come tale metodo implicitamente chiamare .to_i
sul suo argomento, e chiamando to_i
su tale stringa restituirà sempre il prefisso numerico e rilasciare il restante testo-è tutto fluff in quel punto.
È possibile che questo presuppone che si sta utilizzando il percorso di default di /:controller/:action/:id
, che renderebbe i tuoi URL assomigliano
/fornitori/show/1-Acme
Ma se si vuole loro di guardare solo
/1-Acme
Poi hanno un percorso simile
map.show_vendor '/:id', :controller => 'vendors', :action => 'show'
Ciò implicherebbe che sarebbe ingoiare un sacco di URL che probabilmente non lo vorremmo. Fai attenzione
fonte
2009-04-07 05:10:17
Ciao, grazie per questo - cosa intendi con "inghiottire un sacco di URL che non vorresti fosse?" oh, vuoi dire che il percorso cambierebbe praticamente qualsiasi cosa chiamasse quel controller, intendi? Io sto bene con i venditori/show/1-Acme ... come influisce sul SEO? – AFG
Sì, '/: id' corrisponderebbe a molte cose, quindi dovresti avere molti percorsi con nome per '/ about', '/ contact', ecc. Per quanto riguarda il SEO, penso che il prefisso del numero sia trascurabile . –
Quindi, come potrei creare una rotta denominata per i fornitori/elenco che corrisponderebbe all'azione nel vendor_controller.rb chiamata 'lista'? Grazie. Altrimenti sembra buono. – AFG