Ruby Sinatra/Rack“错误URI::InvalidURIError:错误URI(不是URI?)”在重定向上
我刚刚开始了我的第一个Sinatra项目,一个简单的电视节目管理web应用程序,希望有漂亮的URL。因此,当用户在搜索框中键入并提交时,我不希望有一个Ruby Sinatra/Rack“错误URI::InvalidURIError:错误URI(不是URI?)”在重定向上,ruby,escaping,sinatra,uri,rack,Ruby,Escaping,Sinatra,Uri,Rack,我刚刚开始了我的第一个Sinatra项目,一个简单的电视节目管理web应用程序,希望有漂亮的URL。因此,当用户在搜索框中键入并提交时,我不希望有一个/?search=foobar-样式的URL,并希望将它们重定向到/search/foobar。这还使我能够将get'/search/:name路由与主get'/'路由分开。我使用之前的过滤器实现了重定向,并正确地转义了参数[]变量: before do if params.has_key? 'search' redirec
/?search=foobar
-样式的URL,并希望将它们重定向到/search/foobar
。这还使我能够将get'/search/:name
路由与主get'/'路由分开。我使用之前的过滤器实现了重定向,并正确地转义了参数[]
变量:
before do
if params.has_key? 'search'
redirect to("/search/#{URI.escape(params['search'])}")
end
end
然后我继续
get '/search/:query' do
result = search_api params[:query]
if result == 'null'
# no results
else
result = JSON.parse(result)
if result.key? 'shows'
# display search results
else
# redirect to one single show
# (result.keys).first is the real name of the show provided
# by the api. It may contain special characters
#
# (result.keys).first #=> "Breaking Bad"
# result.keys #=> "Breaking Bad"
# result.key? "Breaking Bad" #=> true
redirect to('/show/#{URI.escape((result.keys).first)}')
end
end
end
不幸的是,只有在名称中除了%
之外没有URI特殊字符时,才能重定向到/show
页面。这也意味着没有空间。当我搜索带有空格或umlaut或任何内容的内容时,例如GET
for/?search=Breaking%20Bad
,我从Sinatra/Rack得到以下错误:
[2013-02-02 00:30:29]错误URI::InvalidURIError:错误URI(不是URI?):http://localhost:9393/show/Breaking 坏的
/Users/Ps0ke/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/uri/generic.rb:1202:in“合并中的救援”
/Users/Ps0ke/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/uri/generic.rb:1199:in'merge'
/Users/Ps0ke/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpresponse.rb:220:in'setup_header'
/Users/Ps0ke/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpresponse.rb:150:在“发送响应”中
/Users/Ps0ke/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpserver.rb:110:in'run'
/Users/Ps0ke/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/server.rb:191:in'block in start_thread'
浏览器向我显示,它被重定向到/search/Breaking%20Bad
,因此第一次重定向成功。这个“错误”只有在搜索产生准确命中时才会发生,因此重定向的问题是在get'/search/:query'
路径中搜索。我记得它曾经工作过一次,但在我的git历史记录中找不到正确的提交
我在跑步
%gem列表sinatra
西纳特拉(1.3.4、1.3.3)
%宝石列表架
机架(1.4.4、1.4.1)
机架缓存(1.2)
rack-flash3(1.0.3)
机架保护(1.3.2、1.2.0)
机架ssl(1.3.2)
机架测试(0.6.2、0.6.1)
也许你们中的某个人可以告诉我:
无论这是好的还是坏的做法/在sinatra中还有另一种美化URL的方法
如何解决这个问题,因为我认为我已经小心地逃避了一切
提前非常感谢:)排队
redirect to('/show/#{URI.escape((result.keys).first)}')
您使用的是单引号。这意味着不会执行字符串插值,因此文本字符串/show/#{URI.escape((result.keys).first)}
被用作url,这就是它失败的原因
为了使插值有效,您需要使用如下双引号:
redirect to("/show/#{URI.escape((result.keys).first)}")
这将导致#{URI.escape((result.keys.first)}
被替换为转义的电影名称,该名称应该是有效的url
请注意,在第一次重定向中,确实使用了双引号,因此它可以正常工作:
redirect to("/search/#{URI.escape(params['search'])}")
只是想澄清一下,调用result.keys
的结果是什么(例如)?“变坏”?请添加您正在使用的Sinatra和Rack版本。哦,天哪,这太尴尬了!有时,你为我们调试,而忽略了树木的树木。谢谢。一些文本编辑器(如Sublime text)将以不同的颜色突出显示插值部分(如果使用双引号),以便您可以看到它将被插值。