Rails项目有一个Article模型,对应ArticlesController控制器,其路由设置如下:
resources :articles do
end
这样它的CRUD路径就都自动创建出来了 ;)
现在我想再添加一个对Article模型搜索的页面,那么首先要在控制器中添加对应的search方法:
def search
render text:"hello search!!!"
end
然后在Article默认路由集合后面添加一行新路由:
get "articles/search",to:"articles#search"
现在我们访问一下articles/search页面,咦?怎么出错了:
仔细看出错信息,原来Article之前的show路由恰恰可以匹配新的search路由,只不过原来的:id变成了search这个字符串哦.这就是为什么报Couldn’t find Article with id=search的原因了!
下面给出解决,我们只需要先禁用默认的show路由:
resources :articles,except:[:show] do
resources :comments
end
然后再生成一条筛选路由即可,所谓筛选路由就是对该路由内容进行细粒度匹配的方法:
get "articles/:id",to:"articles#show",constraints:{id:/\d+/}
路由都是从上之下依次匹配的,如果上面一条被匹配则路由匹配结束!这里只匹配id为数字的articles/xxx路径,所以search就会默认被忽略从而被后面search正确的路由所匹配!
筛选路由后面还可跟复杂的block,我们有机会再谈 ;)