2013-04-04 14 views
11

Potrzebuję jednej ścieżki dostępnej poprzez wiele nazw. W moim routes.rb zrobiłemNazwa trasy alias

get '/route' => 'controller#edit', :as => 'name_a' 
get '/route' => 'controller#edit', :as => 'name_b' 

Działa to dobrze, ale ładuje tabelę tras za nic. Z mojego rozumienia dokumentacji, :as określa metodę pomocnika po wywołaniu.

Poszedłem więc do mojego ApplicationController i dodał

alias_method :name_b, :name_a 

i usunąłem drugą linię z routes.rb

ale nie z Uncaught exception: undefined method name_a for class ApplicationController

jest jakiś właściwy sposób mający dwie nazwy pojedyncza ścieżka?

================= EDIT ==================== Opracowanie:

I użyj Devise gem do zarządzania sesją, rejestracją, blokowaniem itp. 2 rodzajów użytkowników, nazwijmy je Admin i Guest. Klejnot bardzo dobrze się układa, ale prosi o to, by ostateczne nazwy tras zachowywały się właściwie.

W moim przypadku, o ile Devise dotyczy tylko proces rejestracji jest inny, więc staram się zbudować strukturę, która wygląda następująco:

app 
    controllers 
    users 
     admin 
      registration_controller.rb 
     guest 
      registration_controller.rb 
     session_controller.rb 
     password_controller.rb 
     registration_controller.rb 

Admin i Guest kontrolerów dziedziczą z powyżej registration_controller, który dziedziczy od Devise.

Teraz, aby działać poprawnie, Devise potrzebuje na przykład nazw guest_user_password i admin_user_password do tworzenia lub usuwania wyszukiwania haseł. W moim przypadku obie są pod tą samą ścieżką, więc chcę obie nazwy przekierować do tego samego kontrolera "użytkownicy/hasło".

Ważniejsze, i dlatego naprawdę chciałem alaisingu. Czy moje poglądy nie powinny przejmować się, czy ma do czynienia z trasami Admin i Guest podczas przekierowywania do kontrolera pobierania haseł. Oba są użytkownikami, więc chcę użyć obu tych opcji.

Stąd moje pytanie. :)

Należy również zauważyć, że jak to napisałem, wszystko działa. Po prostu staram się uzyskać "najbardziej elegancki sposób" napisania tego.

+1

The: as => 'name_a' tworzy alias, którego możesz użyć dla trasy, na przykład name_a_path i name_b_path, jego mechanizm routingu, a nie coś, co dzieje się w kontrolerze. –

+0

Oznacza to, że nie, nie ma innego sposobu, jak tylko załadować tabelę routingu. :(Dzięki, – muichkine

+0

Dlaczego na świecie powinieneś odwoływać się do tej samej ścieżki różnymi nazwami? – Catfish

Odpowiedz

3

Co powiesz na umieszczenie aliasu w aplikacji ApplicationController?

class ApplicationController < ActionController::Base 

alias_method :route_new, :route_old 
helper_method :route_new 

Pamiętaj, że to najpierw imię, potem stare imię.

Wywołanie helper_method ma na celu użycie ich w widokach, a nie tylko kontrolerach.

Jeśli chcesz, możesz umieścić to w dołączonym modułem nazywa coś podobnego RouteAliases

+0

To nie dodaje żadnej publicznej trasy do aplikacji. – muichkine

+0

@muichkine ani nie powinien, dlaczego potrzebujesz nowej trasy? Ale wiesz, że musisz nazwać to alias_method:: route_new_path,: route_old_path, tak? – Houen

+0

Nowa droga wyjaśni API dla zewnętrznych integratorów. Ale faktycznie znalazłem moje rozwiązanie z 'resources: goods,: controller =>: items,: type => 'Good' zasoby: services,: controller =>: items,: type => 'Service'' – muichkine

0

Można dodać coś takiego do swojego routes.rb:

Rails.application.routes.draw do 

    ... 

    Rails.application.routes.named_routes.tap do |named_routes| 
    named_routes['new_name'] = named_routes['real_name'] 
    end 
end 

To stworzy new_name_path i new_name_url pomocników. Testowałem to z Railsami 5.0.6.