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

88

Je veux que mes URL utilisent le tiret -au lieu du trait de soulignement _comme séparateurs de mots. Par exemple controller/my-actionau lieu de controller/my_action.

Je suis surpris par deux choses:

  1. Google et coll. continuer à les distinguer.
  2. Que Ruby on Rails ne dispose pas d' un simple paramètre de configuration globale de la carte -à _dans le routage. Ou le fait-il?

La meilleure solution que j'ai est d'utiliser :asou une route nommée.

Mon idée est de modifier le routage Rails pour vérifier cette configuration globale et de passer -à _avant d'envoyer une action de contrôleur.

Y a-t-il un meilleur moyen?

pduey
la source
Je préfère également les tirets aux traits de soulignement dans les URL (ainsi que dans les identifiants, noms et classes d'élément html / css), mais je n'ai pas essayé de l'implémenter. Je migrerais d'abord vers les rails 3, puis je m'inquiéterais à ce sujet car rails 3 a beaucoup de mises à niveau drastiques du middleware et du routage.
yfeldblum
Merci Justice. Je vais attendre jusqu'à ce que je mette à niveau et me familiarise avec la v3.
pduey
Voir cet article sur les itinéraires avec
trait d'union

Réponses:

74

Avec Rails 3 et versions ultérieures, vous pouvez faire comme ceci:

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

Une autre option est de modifier Rails, via un initialiseur. Je ne recommande pas cela cependant, car cela pourrait casser dans les versions futures (modifier: ne fonctionne pas dans Rails 5).

Utiliser :pathcomme indiqué ci-dessus est préférable.

# 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
la source
1
Je suis tout nouveau sur Rails. Dans quel fichier ajouteriez-vous une ligne comme celle-ci?
Alan
5
il doit y avoir un moyen meilleur et plus rapide de convertir toutes les routes qui ont un trait de dessous en traits d'union
carbonr
2
@carbonr et l'exemple que je viens d'ajouter? :)
sandstrom
@sandstrom c'est tout! sucré!
carbonr
3
Malheureusement, ce correctif de singe ne fonctionne plus dans Rails 5. Cela rendra tout sauf #index et #create, qui resteront en tant que soulignement et créeront des bugs désagréables. Si quelqu'un a un script mis à jour pour Rails 5, ce serait très apprécié.
Kelsey Hannan
3

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
Lev Lukomsky
la source
2

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

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

Désormais, les URL comme http: // my_application / abc 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) 

serait évalué à l'url ' http: // mon_application / val1-val2-val3 '.

Kan
la source
3
Je veux éviter la maintenance manuelle du routage, donc les routes nommées sont sorties. Je veux juste que le routage des rails fasse le remplacement pour moi en gros et garde mes fichiers de configuration serrés.
pduey
2

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

obtenir 'blog / exemple-texte' ceci 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 voici le lien réel site.com/blog/example-text

J'ai pensé que cela fonctionne pour moi, et c'est plus efficace que de souligner le référencement

neinx
la source