Rails JSON端点路由命名规则:URL带.json后缀报错问题咨询
问题解答
Rails路由是否允许URL中直接写.json后缀?
- 答案是允许的,你遇到的报错不是后缀本身不合法,是路由配置没有正确处理格式声明导致的。
- 报错的根本原因:你把
.json直接写死在路由的路径字符串里时,Rails默认不会把这个后缀识别为请求的format参数,只会把它当成普通路径片段处理。此时Rails无法匹配到对应的响应格式,会默认尝试查找对应名字的模板文件,找不到就抛出ActionController::UnknownFormat错误。 - 你不带后缀的路由可以正常工作,是因为此时Rails可以通过控制器的
render json: xxx语句、或者请求头的Accept参数正确识别响应格式,不需要查找模板。
保留.json后缀的正确配置方法
有两种常用配置方式可以满足需求:
方式1:显式声明format参数并约束为json
这种写法会自动匹配所有带.json后缀的请求,同时Rails能正确识别format参数:
get '/controller/controller_method.:format', to: 'controller#controller_method', constraints: { format: :json }
配置后仅/controller/controller_method.json可以命中该路由,完全符合你要保留后缀的需求。
方式2:写死后缀的同时手动指定默认format
如果你一定要把.json完整写死在路由路径字符串里,只需要额外加defaults参数手动指定响应格式即可:
get '/controller/controller_method.json', to: 'controller#controller_method', defaults: { format: :json }
这样Rails就会直接认定该路由的响应格式为json,不会再去查找模板文件,报错就会消失。
内容的提问来源于stack exchange,提问作者Peabrain
相关产品推荐
相关产品推荐

