2012-03-12 4 views
10

redirect_toにパラメータ(ハッシュ)を渡したいのですが、どうすればいいですか?たとえば、次のようにパラメトリックでredirect_toを実行する

hash = { :parm1 => "hi", :parm2 => "hi" } 

と私はこのようなURL

/helloページにリダイレクトします:あなたがのために/ハローという名前のルートを持っていない場合は /hello?parm1=hi&parm2=hi

+3

あなたも試してくださいましたか? – austinbv

+0

どのコントローラとアクションが/ helloへのルートですか? – James

+0

あなたは単にこれを行うことはできませんか? redirect_to 'path'、:parm1 => "hi"、:parm2 => "hi" – AyJay

答えて

19

は、あなたがハードコーディングする必要がありますあなたはredirect_toに渡す文字列にパラメータを設定します。

しかし、あなたがhello_pathのようなものを持っていたならば、あなたはそれが必要なすべての値を取得するために解析し

+0

こんにちは、お返事ありがとうございます。しかし、パラメータの数は分かっていないので、それらをハードコードすることはできません。 – ygnhzeus

+1

hello_path()の1つの引数としてparamsのハッシュ全体を渡すことができ、各キーと値のペアをパラメータとして書きます – xkickflip

+0

@ygnhzeusそのため、名前付きパスを使用する必要があります。 – James

1

redirect_to hello_path(:param1 => 1, :param2 => 2)は単純に、URL内の引数にハッシュを渡すと、コード内で使用することができます。

param_arr = [] 
hash.each do |key , val| 
    param_arr << "#{key}=#{val}" 
end 
params_str = param_arr.join("&") 

redirect_to "http://somesite.com/somepage?#{params_str}" 

私は、これはそれを行うには非常に基本的な方法かもしれませんが、ちょっと、それはどこかを取得します:)

+2

すでにRailsを使っているので、['to_param'](http://apidock.com/rails/Hash/to_param)メソッドを使うこともできます。 – JacobEvelyn

0

を私が前に、次の関数を使用しました:

def add_query_params(url, params) 
    parsed_uri = URI(url) 

    if parsed_uri.query 
    query_params = URI.decode_www_form(parsed_uri.query) 
    else 
    query_params = [] 
    end 

    params.each_pair do |k, v| 
    query_params << [k.to_s, v] 
    end 

    parsed_uri.query = URI.encode_www_form(query_params) 
    parsed_uri.to_s 
end 

使用例:

redirect_to add_query_params("/hello", parm1: 'hi', parm2: 'hi') 

これは、URLのparams任意の既存のURLが既に含まれている場合があります保存するという利点があります。

6

の代わりに:あなたが行うことができます

redirect_to some_params 

redirect_to url_for(some_params) 

あなたはredirect_toに渡す前にurl_forとURLへのparamsを回すので、あなたがredirect_toを渡すことはされて終わるいますredirect_toがリダイレクトするのがうれしい文字列としてのURL。

よく御座います。:なぜredirect_toがparamsの使用を拒否したのか分かりません。以前はparamsを使用していました。いくつかの点で、誰かがそれを禁止するためにRailsに何かを追加しました。セキュリティ上の理由があると思われる場合は、これらのセキュリティ上の理由により、手動でredirect_to url_for(p)を実行してもセキュリティ上の問題が発生する可能性があります。しかし、私はここで何が起きているのかを説明する書類はまだ見つけられていません。

更新:私は、セキュリティ警告を見つけたが、まだそれを消化していない:https://github.com/rails/rails/pull/16170