2011-07-02 11 views
17

コールバックURL文字列params[:callback]があります。クエリ文字列"&result=true"を追加して、ユーザーをリダイレクトする必要があります。私はこれを行う見つけ、より良い方法はaddressableを使用しているが、私はコードが、我々はルビーについて話している場合は特に、このようなタスクのために大きすぎると思う:URLにクエリ文字列を追加する

callback = Addressable::URI.parse(params[:callback]) 
query = callback.query_values 
query[:result] = 'true' 
callback.query_values = query 

redirect_to callback.to_s 

と同じ結果を得るためのよりエレガントな方法はありますこのスニペット?

答えて

8
  • あなたはこれを行うことができます任意のURLの検証を必要としない場合には(に見える少し汚い):
    
    url = params[:callback] 
    redirect_to url + (url.include?('?') ? '&' : '?') + 'result=true' 
    
  • は、そうでなければ、標準ライブラリからいくつかの外部ライブラリ(アドレス指定など)またはURIのモジュールのいずれかを使用する必要があります
+1

を使用して、我々が必要とする任意の微調整を行うことはええ、それが汚れて見えます。 Addressableを使って私のコードを見ると、とにかくこのコードが短くなる可能性がありますか? – MIchel

-2

あなたは、これが追加されますmerge

request.parameters.merge({:result => true})

で試すことができますよurパラメータを既に定義されているパラメータに変更します。

+0

OPは変数にURLを持っています。現在のリクエストURLではありません – Gareth

4
callback.query_values = callback.query_values.merge({"result" => "true"}) 
+0

'callback.query_values'が' nil'を返すことができるので、マウナの答えはより良いです。これは 'merge'に応答しません – FeifanZ

0

あなたはかなり近づいていると思います。あなたは1行か2行を押しつぶすかもしれませんが、 しかし、実際には何も得られません。

callback = Addressable::URI.parse(params[:callback]) 
callback.query_values = callback.query_values.merge {:results => 'true' } 
redirect_to callback.to_s 

コールバックは、アプリケーション内で常にある場合は、涼しさの程度が異なるいくつかの他のオプションを持っているかもしれませんが、それはそうであったかどうかを指定しませんでした。

8

解決策のいずれかが私には役に立たなかったので、このトピックを更新することはできません。

実際のURLに既存のクエリ値がない場合、callback.query_valuesNilを返すようです。次のようなURLを持っている場合

したがって:

url = "http://www.foo.com" # or params[:callback] obviously. :) 

callback = Addressable::URI.parse(url) 
callback.query_values = (callback.query_values || {}).merge({ 
    result: true 
}) 

redirect_to callback.to_s 

乾杯:http://www.foo.comhttp://www.foo.com?bar=1を次のコードを使用する必要があります。

0

年後、私はこの問題のより良い解決策を見つけました。

super最初から値を取得し、その後、Addressable

def url_for(options={}) 
    val = super 
    if params[:locale].present? 
     parsed = Addressable::URI.parse(val) 
     query_array = parsed.query_values(Array) || [] 
     query_array << ['locale', params[:locale]] 
     parsed.query_values = query_array 
     val = parsed.to_s 
    end 
    val 
end 
関連する問題