방금 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)
어쩌면 당신의 사람이 말해 줄 수 실행하고이 좋거나 나쁜 관행인지
- 을 /시나 다른 방법은 어떻게하는 URL을
- 을 prettifiy 할 수있다 내가 이미 모든 것을 조심스럽게 피했다고 생각하기 때문에 이것을 고쳐주세요.
감사합니다. v 당신은 작은 따옴표를 사용하는
redirect to('/show/#{URI.escape((result.keys).first)}')
라인에서 미리 :
그냥 명확히하기 : 첫 번째 리디렉션에 큰 따옴표를 사용합니까, 그래서 그것은 예상대로 작동하는지
는주? "속보"? 그리고 사용중인 Sinatra 및 Rack의 버전을 추가하십시오. – iain