2013-02-01 2 views
1

방금 ​​TV 쇼 관리 웹 앱인 Sinatra 프로젝트를 처음 시작했고 아름다운 URL을 원했습니다. 따라서 사용자가 검색 창에 입력하고 제출할 때 /?search=foobar 스타일의 URL을 원하지 않고 /search/foobar으로 리디렉션하고 싶습니다. 이 또한 get '/' 경로에서 get '/search/:name 경로를 분리 할 수있게 해줍니다. 나는 before 필터를 사용하여 리디렉션을 구현하고 제대로 params[] 변수를 탈출했습니다이있는 경우 나, 불행하게도Sinatra/Rack`ERROR URI :: InvalidURIError : 잘못된 URI (URI가 아닌?)`리디렉션시

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 페이지로 리디렉션을 계속

before do 
    if params.has_key? 'search' 
     redirect to("/search/#{URI.escape(params['search'])}") 
    end 
end 

이후 이름에 URI가없는 특수 문자가 %. 이것은 또한 공백이 없음을 의미합니다. 공백이나 움라우트 등으로 무엇인가를 검색 할 때.

[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로 리디렉션있어 것을 나에게 보여주고, 그래서 첫 번째 리디렉션 일 : /?search=Breaking%20Bad에 대한 GET, 나는시나/랙에서 다음과 같은 오류가 발생합니다. 이 "버그"는 검색이 정확한 조회를 생성 할 때만 발생하므로 리디렉션의 문제점은 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. 을 /시나 다른 방법은 어떻게하는 URL을
  2. 을 prettifiy 할 수있다 내가 이미 모든 것을 조심스럽게 피했다고 생각하기 때문에 이것을 고쳐주세요.

감사합니다. v 당신은 작은 따옴표를 사용하는

redirect to('/show/#{URI.escape((result.keys).first)}') 

라인에서 미리 :

+0

그냥 명확히하기 : 첫 번째 리디렉션에 큰 따옴표를 사용합니까, 그래서 그것은 예상대로 작동하는지

주? "속보"? 그리고 사용중인 Sinatra 및 Rack의 버전을 추가하십시오. – iain

답변

2

에서 많은 ERY. 즉, 문자열 보간이 수행되지 않으므로 리터럴 문자열 /show/#{URI.escape((result.keys).first)}이 URL로 사용되고 있으며 그 이유는 실패한 것입니다.

보간하기 위해서는이 같은 큰 따옴표를 사용해야하는 작업에서 :

redirect to("/show/#{URI.escape((result.keys).first)}") 

#{URI.escape((result.keys).first)}가 유효한 URL이어야 이스케이프 영화 이름으로 대체하게됩니다. 무엇을 (예를 들어)`result.keys`를 호출 한 결과가 될 것입니다,

redirect to("/search/#{URI.escape(params['search'])}") 
+0

오, 이런, 당황 스럽네! 때때로 우리는 우리를 위해 디버그하고 나무에 대한 나무를 잃어 버립니다. 고맙습니다. – Ps0ke

+0

일부 텍스트 편집기 (숭고한 텍스트)는 보간 될 부분을 볼 수 있도록 다른 색상으로 보간 부분을 강조 표시합니다 (큰 따옴표를 사용한 경우). –

관련 문제