2012-03-12 19 views
10

Voglio passare i parametri (un hash) a redirect_to, come fare questo? Per esempio:Rails redirect_to con params

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

e voglio riorientare alla pagina /hello

URL simile a questo: /hello?parm1=hi&parm2=hi

+3

hai ancora di provare? – austinbv

+0

A quale controller e azione si indirizza/ciao? – James

+0

Non puoi semplicemente fare così? redirect_to 'percorso',: parm1 => "ciao",: parm2 => "ciao" – AyJay

risposta

19

Se non si dispone di un percorso che prende il nome/ciao allora dovrete hardcode i parametri nella stringa passata a redirect_to.

Ma se si ha qualcosa di simile hello_path allora si potrebbe utilizzare redirect_to hello_path(:param1 => 1, :param2 => 2)

+0

Ciao, grazie per la risposta.Ma il numero di parametri non è noto, quindi non riesco a codificarli .. – ygnhzeus

+1

dovresti essere in grado di passare l'intero hash dei parametri come argomento a hello_path() e scriverà ogni chiave, coppia di valori come parametro – xkickflip

+0

@ygnhzeus Ecco perché dovresti usare il percorso indicato. – James

1

semplicemente, passare l'hash in un argomento nella URL, e nel codice parse a uscire tutti i valori necessari.

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}" 

So che questo potrebbe essere il modo molto semplice per farlo, ma hey, è prendo da qualche parte :)

+2

Dato che stiamo già utilizzando Rails, potremmo usare il metodo ['to_param'] (http://apidock.com/rails/Hash/to_param). – JacobEvelyn

0

ho usato la funzione segue prima:

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 

Esempio utilizzo:

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

Questo ha il vantaggio di conservare qualsiasi URL esistente params l'URL potrebbe già contenere.

6

Invece di:

redirect_to some_params 

Si può fare:

redirect_to url_for(some_params) 

si ruota la params in un'URL con url_for prima di passarlo al redirect_to, così che cosa si passa redirect_to finisce per essere un URL come stringa, a cui redirect_to è felice di reindirizzare.

Nota bene: Non capisco perché redirect_to rifiuti di utilizzare i parametri. Era solito usare i params. In alcuni punti qualcuno ha aggiunto qualcosa a Rails per vietarlo. Mi viene il sospetto che ci siano ragioni di sicurezza per farlo, e se così fosse, questi motivi di sicurezza potrebbero significare che fare manualmente lo redirect_to url_for(p) ha implicazioni sulla sicurezza. Ma non sono ancora riuscito a trovare alcuna documentazione che spieghi cosa c'è qui sopra.

aggiornamento: ho trovato l'avviso di protezione, ma non hanno ancora digerito: https://github.com/rails/rails/pull/16170