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.