2017-01-04 1 views
0

Ich habe die folgenden zwei Routen in meiner Rails-Anwendung:Rails Einschränkung auf dem Weg, die dynamische Segment enthält

match '/users/:username' => 'users#show', :via => :get, :as => :user 
match '/users(/:filter)' => 'users#index', :via => :get, :as => :users 

Dies ist so, dass ich Routen wie haben:

/users/cameron /users/popular

Wo ist der erste ein Benutzer, und der zweite ist ein Filter.

Das Routing in Rails wird jedoch immer die erste Route treffen, weil es den Unterschied zwischen :username und :filter nicht kennt.

Beiträge vermeide ich dieses Problem, indem Sie:

match '/posts/:id' => 'posts#show', :via => :get, :as => :post, :id => /[0-9]/ 

Das funktioniert aber nur, weil Beiträge sind immer ganze Zahlen. Zum Beispiel: /posts/21

Wie kann ich eine Beschränkung auf meine Benutzerrouten anwenden, so dass sie nicht übereinander stolpern und ohne ein Präfix zu einem von ihnen hinzufügen müssen.

+0

warum nicht eine Abfrage-String auf die URL, die anstelle für die Filterung? (dh 'Benutzer? Filter = beliebt ') –

+0

@ MarioPérez Kurze Antwort ist ... Ich will nicht :) – Cameron

+0

Vielleicht dann mit einer Einschränkung, die überprüft, ob die Zeichenfolge ist ein Benutzername oder nicht http://guides.rubyonrails.org/routing.h tml # advanced-constraints, damit Sie die richtige Route auswählen können. Aber die Abfrage der Datenbank scheint für die Performance nicht richtig zu sein. Wenn es deine einzige Option ist ¯ \\ _ (ツ) _/¯ –

Antwort

0

ich diesen Ansatz versucht haben (basierend auf den Link von @Mario bereitgestellt

match '/users/:username' => 'users#show', :via => :get, :as => :user, :constraints => lambda { |request| User.usernames.include?(request.params[:username]) }

und in meinem User-Modell:

def self.usernames 
    User.pluck(:username) 
end 
Verwandte Themen