Routen mit Bindestrich `-` anstelle von Unterstrich` _` in Ruby on Rails


87

Ich möchte, dass meine URLs Bindestrich -anstelle von Unterstrichen _als Worttrennzeichen verwenden. Zum Beispiel controller/my-actionanstelle von controller/my_action.

Ich bin über zwei Dinge überrascht:

  1. Google et al. weiterhin zu unterscheiden.
  2. Dieser Ruby on Rails verfügt nicht über einen einfachen globalen Konfigurationsparameter, dem -er _im Routing zugeordnet werden kann. Oder doch?

Die beste Lösung ist die Verwendung :aseiner benannten Route.

Meine Idee ist es, das Rails-Routing zu ändern, um nach dieser globalen Konfiguration -zu suchen und zu wechseln , _bevor es an eine Controller-Aktion gesendet wird.

Gibt es einen besseren Weg?


Ich bevorzuge auch Bindestriche gegenüber Unterstrichen in URLs (sowie in HTML / CSS-Element-IDs, -Namen und -Klassen), aber ich habe nicht versucht, sie zu implementieren. Ich würde zuerst auf Rails 3 migrieren und mich dann darum kümmern, da Rails 3 viele drastische Upgrades für Middleware und Routing aufweist.
Yfeldblum

Danke Gerechtigkeit. Ich werde warten, bis ich ein Upgrade durchführe und mich mit v3 vertraut mache.
pduey

Siehe diesen Artikel über getrennte Routen in Schienen
Yarin

Antworten:


74

Mit Rails 3 und höher können Sie Folgendes tun:

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

Eine andere Möglichkeit besteht darin, Rails über einen Initialisierer zu ändern. Ich empfehle dies jedoch nicht, da es in zukünftigen Versionen möglicherweise kaputt geht (bearbeiten: funktioniert nicht in Rails 5).

Die Verwendung :pathwie oben gezeigt ist besser.

# 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

1
Ich bin brandneu bei Rails. In welche Datei würden Sie eine solche Zeile einfügen?
Alan W. Smith

3
Es muss einen besseren und schnelleren Weg geben, um alle Routen, die unterbewertet sind, in Bindestriche
umzuwandeln

2
@carbonr wie wäre es mit dem Beispiel, das ich gerade hinzugefügt habe? :)
Sandstrom

@ Sandstrom das ist es! Süss!
Carbonr

3
Leider funktioniert dieser Affen-Patch in Rails 5 nicht mehr. Dadurch wird alles außer #index und #create, die als Unterstrich bleiben und böse Fehler verursachen, dasherisiert. Wenn jemand ein aktualisiertes Skript für Rails 5 hat, wäre es sehr dankbar.
Kelsey Hannan

3

Sie können Controller- und Aktionsnamen überladen, um Bindestriche zu verwenden:

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

Sie können in der Konsole testen:

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

2

Sie können benannte Routen verwenden. Es erlaubt die Verwendung von '-' als Worttrennzeichen. In route.rb,

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

Jetzt werden URLs wie http: // my_application / abc zum angegebenen Controller und zur angegebenen Aktion.

Auch zum Erstellen dynamischer URLs

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

In diesem Fall werden 'id1, id2 & id2 als http-Parameter an die Aktion übergeben

In Ihren Aktionen und Ansichten,

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

würde zu URL ' http: // my_application / val1-val2-val3 ' auswerten .


2
Ich möchte die manuelle Wartung des Routings vermeiden, daher sind benannte Routen nicht verfügbar. Ich möchte nur, dass das Rails-Routing den Ersatz für mich im Großhandel übernimmt und meine Konfigurationsdateien dicht hält.
pduey

2

Wenn Sie in einem Controller und einer Ansichtsdatei Unterstriche verwenden, verwenden Sie einfach Bindestriche in Ihrer Routendatei, und es funktioniert.

get 'blog / example-text' das ist meine Route für diesen Controller

def example_text end <- das ist mein Controller

und example_text.html.erb ist die Datei

und dies ist der eigentliche Link site.com/blog/example-text

Ich dachte, das funktioniert bei mir und es ist effektiver als es SEO unterstreicht

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.