2017-01-04 72 views
0

我有以下兩種途徑在我的Rails應用程序:的Rails在包含路由約束動態段

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

這是爲了讓我能有這樣的路線:

/users/cameron /users/popular

第一個是用戶,第二個是過濾器。

但是Rails中的路由將始終選擇第一條路由,因爲它不知道:username:filter之間的區別。

對於帖子中,我避免這個問題做:

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

但是這隻能是因爲職位總是整數。例如:/posts/21

如何將約束應用於我的用戶路由,以便它們不會彼此絆倒,也不必爲其中的任何一個添加前綴。

+0

爲什麼沒有在網址中的查詢字符串,而不是(即'users?filter = popular') –

+0

@MarioPérez簡短的回答是...我不想:) – Cameron

+0

也許然後使用一些約束,檢查字符串是否是一個用戶名或不http:///guides.rubyonrails.org/routing.h tml#advanced-constraints,這樣你就可以選擇合適的路線。但是查詢數據庫對於性能來說並不合適。如果這是你唯一的選擇¡\\ _(ツ)_ /¯ –

回答

0

我試過這個方法(基於由@Mario

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

,並在我的用戶模型提供的鏈接:

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