Trasy z kreską `-` zamiast podkreślenia` _` w Ruby on Rails


88

Chcę, aby moje adresy URL używały myślnika -zamiast podkreślenia _jako separatorów słów. Na przykład controller/my-actionzamiast controller/my_action.

Dziwią mnie dwie rzeczy:

  1. Google i in. nadal je rozróżniać.
  2. Że Ruby on Rails nie posiada prosty, globalny parametr konfiguracyjny do mapy -, aby _w routingu. Czy to prawda?

Najlepszym rozwiązaniem jest użycie :asnazwanej trasy.

Moim pomysłem jest zmodyfikowanie routingu Railsów, aby sprawdzić tę globalną konfigurację i zmienić -na_ przed wysłaniem do akcji kontrolera.

Czy jest lepszy sposób?


Wolę również myślniki od podkreślenia w adresach URL (a także w identyfikatorach, nazwach i klasach elementów html / css), ale nie próbowałem tego zaimplementować. Najpierw przeprowadziłbym migrację do rails 3, a potem martwiłbym się o to, ponieważ rails 3 mają wiele drastycznych aktualizacji oprogramowania pośredniego i routingu.
yfeldblum

Dzięki Sprawiedliwości. Wstrzymam się, dopóki nie zaktualizuję i nie zapoznam się z wersją 3.
pduey

Zobacz ten artykuł o łączonych trasach w szynach
Yarin

Odpowiedzi:


74

Z Railsami 3 i nowszymi możesz zrobić tak:

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

Inną opcją jest modyfikacja Railsów poprzez inicjator. Nie polecam tego jednak, ponieważ może się zepsuć w przyszłych wersjach (edit: nie działa w Railsach 5).

Używanie, :pathjak pokazano powyżej, jest lepsze.

# 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
Jestem zupełnie nowy w Railsach. Do jakiego pliku dodałbyś taką linię?
Alan W. Smith

5
musi istnieć lepszy i szybszy sposób na konwersję wszystkich tras, które mają podkreślenie na łączniki
carbonr

2
@carbonr a co z przykładem, który właśnie dodałem? :)
sandstrom

@sandstrom to wszystko! Słodkie!
carbonr

3
Niestety, ta małpa poprawka nie działa już w Railsach 5. Spowoduje to zniszczenie wszystkiego oprócz #index i #create, które pozostaną podkreślone i stworzą nieprzyjemne błędy. Jeśli ktoś ma zaktualizowany skrypt dla Rails 5, byłby bardzo wdzięczny.
Kelsey Hannan

3

Możesz przeciążać nazwy kontrolerów i akcji, aby używać myślników:

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

Możesz przetestować w konsoli:

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

2

Możesz używać nazwanych tras. Pozwoli to na użycie „-” jako separatorów słów. W route.rb,

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

Teraz adresy URL, takie jak http: // moja_aplikacja / abc, będą kierować do określonego kontrolera i akcji.

Również do tworzenia dynamicznych adresów URL

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

w tym przypadku 'id1, id2 i id2 zostaną przekazane jako parametry http do akcji

W swoich działaniach i poglądach

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

zwróci adres URL „ http: // my_application / val1-val2-val3 ”.


3
Chcę uniknąć ręcznej obsługi tras, więc nazwane trasy są wyłączone. Chcę tylko, aby routing railsów zastąpił mnie hurtowo i zachował szczelność moich plików konfiguracyjnych.
pduey

2

jeśli używasz podkreśleń w kontrolerze i wyświetlasz plik, po prostu użyj myślników w pliku tras i zadziała.

get „blog / example-text” to jest moja trasa dla tego kontrolera

def example_text end <- to jest mój kontroler

a example_text.html.erb to plik

a to jest rzeczywisty link site.com/blog/example-text

Doszedłem do wniosku, że to działa dla mnie i jest bardziej skuteczne niż podkreśla mądrego SEO

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.