Ruby Sinatra/Rack“错误URI::InvalidURIError:错误URI(不是URI?)”在重定向上

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

我刚刚开始了我的第一个Sinatra项目,一个简单的电视节目管理web应用程序,希望有漂亮的URL。因此,当用户在搜索框中键入并提交时,我不希望有一个
/?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)将以不同的颜色突出显示插值部分(如果使用双引号),以便您可以看到它将被插值。