Rails高级路由知识:筛选路由-路由冲突的优雅解决方案

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,我们有机会再谈 ;)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值