1

シンプルなテレビ番組管理 Web アプリである最初の Sinatra プロジェクトを開始したばかりで、美しい URL が必要でした。そのため、ユーザーが検索ボックスに入力して送信するときに、/?search=foobarスタイルの URL を使用したくなく、それらを にリダイレクトしたいと考えています/search/foobarget '/search/:nameこれにより、メイン ルートからルートを分離することもできますget '/'beforeフィルターを使用してリダイレクトを実装し、params[]変数を適切にエスケープしました。

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 特殊文字がない場合にのみ機能し%ます。これは、スペースがないことも意味します。for など、スペースやウムラウトなどを含むものを検索すると、GETSinatra /?search=Breaking%20Bad/Rack から次のエラーが表示されます。

[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. これが良い慣行か悪い慣行か/sinatraにはURLをきれいにする別の方法があります
  2. 私はすでにすべてを慎重にエスケープしたと思うので、これを修正する方法

事前にどうもありがとうございました :)

4

1 に答える 1