是否可以在rails中使用具有不同show动作的相同路径?

时间:2014-06-12 07:18:19

标签: ruby-on-rails ruby ruby-on-rails-4 routes

我正在尝试在我的rails应用中访问以下网址:

example.com/user12 # It should show user#show
exmple.com/wordpress # It should show category#show

我的解决方案:(它不起作用)

routes.rb我已将:path => ''添加到categories and users,以便从网址中删除控制器的名称。

resources :categories, :path => ''
resources :users, :path => ''

当我运行rake routes时,我有以下网址“

category GET    /:id(.:format)   category#show
account GET    /:id(.:format)    accounts#show

所以我认为它应该正常工作,但肯定不行。它仅适用于类别名称和用于显示ActiveRecord::RecordNotFound的用户名。

我知道,我的解决方案是错误的,因为我混淆了rails路由系统,并且因为resources :categories的优先级高于resources :users,所以类别显示页面工作正常。

那么有没有解决方案来解决这样的问题?

2 个答案:

答案 0 :(得分:1)

我终于找到了constraints选项的解决方案。此选项接受正则表达式。

resources :categories, :path => '', constraints: { id: /wordpress|php/ }

每个类别都应该以这种方式手动添加或(我不确定)是否有办法自动列出数据库中的所有类别。

答案 1 :(得分:0)

这样做的一种方法是覆盖默认的rails路由,为此删除resources

我测试了,这有效

SampleRails4::Application.routes.draw do
  get '/user12', to: 'users#show' #=> users/show  
  get '/wordpress', to: 'category#show' #=> assuming u have a controller and action 
end

然而,您必须更新其余代码,例如:users/show可能希望用户ID为关于rails路由的param read more