我的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 :(得分: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