Todas estas soluciones usan find_by_name
, lo que definitivamente requeriría tener un índice en esa columna y requerir que sean únicas. Una mejor solución que hemos utilizado, sacrificando una pequeña cantidad de belleza, es usar el prefijo del nombre del proveedor con su ID. Esto significa que no necesita tener un índice en su columna de nombre y/o requerir exclusividad.
vendor.rb
def to_param
normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '')
"#{self.id}-#{normalized_name}"
end
Así que esto le daría URL como
/1-Acme
/19-Safeway
etc
Luego, en su show acción todavía puede usar
Vendor.find(params[:id])
como el método implícitamente llamar .to_i
en su argumento, y llamando to_i
en una cadena tales siempre devolverá el prefijo numérico y soltar el restante en texto toda su pelusa en ese punto.
Lo anterior supone que está utilizando la ruta por defecto de /:controller/:action/:id
, lo que haría que sus URL se ven como
/vendedores/mostrar/1-Acme
Pero si usted quiere que sólo se ven
/1-Acme
Entonces tienen una ruta como
map.show_vendor '/:id', :controller => 'vendors', :action => 'show'
Esto implicaría que tragaría una gran cantidad de URL que probablemente tampoco querría. Toma una advertencia.
Hola, gracias por esto - ¿A qué te refieres con "tragar muchas URL que no te gustaría?" Oh, ¿te refieres a que la ruta cambiaría prácticamente cualquier cosa que te llame controlador? Estoy bien con los proveedores/show/1-Acme ... ¿cómo afecta el SEO? – AFG
Sí, '/: id' coincidiría con muchas cosas, por lo que tendría que tener muchas rutas con nombre para '/ about', '/ contact', etc. En cuanto a SEO, creo que el prefijo de número es insignificante . –
Entonces, ¿cómo crearía una ruta con nombre para vendedores/lista que correspondería a la acción en el control_de_vendedor.rb llamada 'lista'? Gracias. De lo contrario, se ve bien. – AFG