web-dev-qa-db-fra.com

Routes avec Dash `-` au lieu de Underscore` _` dans Ruby on Rails

Je veux que mes URL utilisent le tiret - au lieu de souligner _ comme séparateurs de mots. Par exemple controller/my-action au lieu de controller/my_action.

Je suis surpris de deux choses:

  1. Google et al. continuer à les distinguer.
  2. Cela Ruby on Rails n'a pas de paramètre de configuration global simple pour mapper - à _ dans le routage. Ou alors?

La meilleure solution que j'ai est d'utiliser :as ou un itinéraire nommé.

Mon idée est de modifier le Rails routage pour vérifier cette configuration globale et changer - à _ avant de passer à une action du contrôleur.

Y a-t-il une meilleure façon?

83
pduey

Avec Rails 3 et plus tard, vous pouvez faire comme ceci:

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

Une autre option consiste à modifier Rails, via un initialiseur. Je ne le recommande pas cependant, car il pourrait se casser dans les futures versions (edit: ne fonctionne pas dans Rails 5).

En utilisant :path comme indiqué ci-dessus est meilleur.

# 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
71
sandstrom

si vous utilisez des traits de soulignement dans un fichier de contrôleur et de vue, utilisez simplement des tirets dans votre fichier de routes, et cela fonctionnera.

obtenir 'blog/exemple-texte' c'est mon itinéraire pour ce contrôleur

def example_text end <- c'est mon contrôleur

et example_text.html.erb est le fichier

et c'est le lien réel site.com/blog/example-text

j'ai pensé que cela fonctionne pour moi, et c'est plus efficace que ce que souligne le SEO

2
neinx

Vous pouvez utiliser des itinéraires nommés. Cela permettra d'utiliser '-' comme séparateurs Word. Dans routes.rb,

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

Maintenant, des URL comme http: // my_application/a-b-c iraient au contrôleur et à l'action spécifiés.

Aussi, pour créer des URL dynamiques

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

dans ce cas, 'id1, id2 & id2 seraient passés en tant que paramètres http à l'action

En vous actions et vues,

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

évaluerait l'url ' http: // my_application/val1-val2-val '.

2
Kan

Vous pouvez surcharger les noms de contrôleur et d'action pour utiliser des tirets:

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

Vous pouvez tester dans la console:

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