Sinatra中redirect的字符串插值功能失效问题排查
问题分析与解决方案:URI::InvalidURIError 错误原因
你碰到的这个问题其实是Ruby字符串基础特性里的一个常见小坑——单引号字符串不支持插值解析!
看你的代码:
redirect to '/posts/#{post.id}'
这里你用单引号包裹了URL,Ruby会把#{post.id}完完全全当作普通文本处理,不会把它替换成post对象的实际ID值。所以最终生成的URL是http://localhost:9393/posts/#{post.id},这个字符串里包含#{}这种不符合URI规范的特殊字符,自然就触发了URI::InvalidURIError。
而你后来用的两种有效写法,本质都是正确生成了带实际ID的合法URL:
- 硬编码ID直接写死了正确的URL格式
'/posts/' + post.id.to_s通过字符串拼接,把ID的字符串值加到了路径里
最简洁的修正方案
把单引号换成双引号就行,双引号包裹的字符串会自动解析#{}插值语法:
redirect to "/posts/#{post.id}"
额外优化建议(针对Sinatra框架)
如果你用的是Sinatra,还可以定义命名路由来让跳转更优雅,避免手动拼接路径:
# 先给详情路由命名 get '/posts/:id', as: :post do # 你的详情页逻辑 end # 然后在更新接口里直接用命名路由辅助方法 patch '/posts/:id' do post = Post.find(params[:id]) post.update(name: params[:name], content: params[:content]) redirect to post_path(post) # 自动生成正确的/posts/[id]路径 end
总结一下,这个问题的核心就是记住Ruby里双引号字符串支持插值和转义,单引号字符串只做字面量解析,下次写需要动态替换内容的字符串时,别选错引号就行~
内容的提问来源于stack exchange,提问作者thumbtackthief
相关产品推荐
相关产品推荐

