2017-01-04 33 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