Rutas con Dash `-` en lugar de subrayado` _` en Ruby on Rails

88

Quiero que mis direcciones URL usen guiones en -lugar de subrayados _como separadores de palabras. Por ejemplo en controller/my-actionlugar de controller/my_action.

Me sorprenden dos cosas:

  1. Google et al. seguir distinguiéndolos.
  2. Que Ruby on Rails no tiene un simple, parámetro de configuración global para asignar -a _la ruta. ¿O lo hace?

La mejor solución que tengo es usar :asuna ruta con nombre.

Mi idea es modificar los rieles de enrutamiento para comprobar que la configuración y el cambio global -a _antes de enviar a una acción del controlador.

¿Existe una forma mejor?

pduey
fuente
También prefiero guiones a guiones bajos en las URL (así como en los identificadores, nombres y clases de elementos html / css), pero no he intentado implementarlo. Primero migraría a rails 3 y luego me preocuparía por esto porque rails 3 tiene muchas actualizaciones drásticas de middleware y enrutamiento.
yfeldblum
Gracias Justicia. Esperaré hasta que actualice y me familiarice con v3.
pduey
Vea este artículo sobre Rutas con guiones en rieles
Yarin

Respuestas:

74

Con Rails 3 y versiones posteriores puedes hacer esto:

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

Otra opción es modificar Rails mediante un inicializador. Sin embargo, no recomiendo esto, ya que puede fallar en versiones futuras (editar: no funciona en Rails 5).

Usar :pathcomo se muestra arriba es mejor.

# 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
Sandstrom
fuente
1
Soy nuevo en Rails. ¿En qué archivo agregarías una línea como esta?
Alan W. Smith
5
Tiene que haber una manera mejor y más rápida de convertir todas las rutas que tienen menos detalles en guiones
carbonr
2
@carbonr ¿qué tal el ejemplo que acabo de agregar? :)
sandstrom
@sandstrom ¡eso es! ¡dulce!
carbonr
3
Lamentablemente, este parche de mono ya no funciona en Rails 5. Esto hará que todo excepto #index y #create, que permanecerá como subrayado y creará errores desagradables. Si alguien tiene un script actualizado para Rails 5, sería muy apreciado.
Kelsey Hannan
3

Puede sobrecargar los nombres de acciones y controladores para usar guiones:

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

Puede probar en la consola:

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

Puede utilizar rutas con nombre. Permitirá usar '-' como separadores de palabras. En route.rb,

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

Ahora las direcciones URL como http: // my_application / abc irían al controlador y la acción especificados.

Además, para crear URL dinámicas

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

en este caso, 'id1, id2 e id2 se pasarían como parámetros http a la acción

En tus acciones y puntos de vista,

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

evaluaría a la URL ' http: // my_application / val1-val2-val3 '.

Kan
fuente
3
Quiero evitar el mantenimiento manual de la ruta, por lo que las rutas con nombre están fuera. Solo quiero que el enrutamiento de rieles haga el reemplazo por mí al por mayor y mantenga mis archivos de configuración ajustados.
pduey
2

Si usa guiones bajos en un controlador y ve un archivo, simplemente use guiones en su archivo de rutas y funcionará.

obtener 'blog / example-text' esta es mi ruta para este controlador

def example_text end <- este es mi controlador

y example_text.html.erb es el archivo

y este es el enlace real site.com/blog/example-text

pensé que esto funciona para mí, y es más efectivo que lo que subraya en cuanto a SEO

neinx
fuente