2013-02-01 72 views
1

我剛開始我的第一個項目西納特拉,一個簡單的電視節目管理的Web應用程序,並希望有美麗的網址。因此,當在搜索框中輸入一個用戶類型和提交,我不希望有一個/?search=foobar風格的URL,並希望做他們重定向到/search/foobar。這也使我的get '/search/:name路線從主get '/'路線分開。我實現了使用before過濾器重定向並正確地躲過了params[]變量:西納特拉/機架`ERROR URI :: InvalidURIError:壞URI(是不是URI?)`對重定向

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 

不幸的是,重定向到一個頁面/show才能正常運行,如果有在遠離%名字沒有URI特殊字符。這也意味着沒有空間。當我搜索空間或元音變音或其他東西時,例如爲/?search=Breaking%20Bad一個GET,我從西納特拉/機架收到以下錯誤:

[2013-02-02 00:30:29] ERROR URI::InvalidURIError: bad URI(is not URI?): http://localhost:9393/show/Breaking Bad 
    /Users/Ps0ke/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/uri/generic.rb:1202:in `rescue in merge' 
    /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:in `send_response' 
    /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 list sinatra 
sinatra (1.3.4, 1.3.3) 

% gem list rack 
rack (1.4.4, 1.4.1) 
rack-cache (1.2) 
rack-flash3 (1.0.3) 
rack-protection (1.3.2, 1.2.0) 
rack-ssl (1.3.2) 
rack-test (0.6.2, 0.6.1) 

也許你有人能告訴我:

  1. 這是好還是壞的做法/存在西納特拉另一種方式prettifiy網址
  2. 如何解決這個問題,因爲我認爲我已經逃脫了一切仔細

謝謝v ERY提前:)

+0

只是爲了澄清,這將是(例如)調用'result.keys'的結果呢? 「絕命毒師」 ?並請加西納特拉的版本和機架你使用。 – iain

回答

2

多,在線路

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'])}") 
+0

噢,我的,這是尷尬!您調試爲我們一些時間,而忽略了木材的樹木。謝謝。 – Ps0ke

+0

某些文本編輯器(如Sublime Text)會以不同顏色突出顯示插值部分(如果您使用雙引號),以便您可以看到它將被插值。 –

相關問題