2012-03-12 14 views
10

Chcę przekazać parametry (hash) do redirect_to, jak to zrobić? Na przykład:Railsy redirect_to z parametrami

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

i chcę, aby przekierować do strony /hello

URL tak: /hello?parm1=hi&parm2=hi

+3

czy nawet spróbować? – austinbv

+0

Do jakiego kontrolera i czy działa/dojeżdża trasa? – James

+0

Nie możesz po prostu tego lubić? przekierowanie do "ścieżki",: parm1 => "cześć",: parm2 => "cześć" – AyJay

Odpowiedz

19

Jeśli nie masz nazwie trasy dla/hello następnie musisz hardcode parametry do ciągu, który przekazujesz do redirect_to.

Ale jeśli coś jak hello_path następnie można użyć redirect_to hello_path(:param1 => 1, :param2 => 2)

+0

Cześć, dziękuję za odpowiedź.Ale liczba parametrów nie jest znana, więc nie mogę ich zakodować na stałe .. – ygnhzeus

+1

powinieneś być w stanie przekazać cały skrót parametrów jako jeden argument do hello_path() i zapisze każdy klucz, wartość pary jako parametr – xkickflip

+0

@ygnhzeus Dlatego powinieneś używać nazwanej ścieżki. – James

1

Proszę, przekaż hash do kłótni w adresie URL, a w kodzie analizować je, aby uzyskać wszystkie potrzebne wartości.

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

Wiem, że to może być bardzo prosty sposób to zrobić, ale hej, to będzie Ci gdzieś :)

+2

Ponieważ używamy już Railsów, równie dobrze możemy użyć metody ['to_param'] (http://apidock.com/rails/Hash/to_param). – JacobEvelyn

0

Użyłem następujące funkcje przed:

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 

Przykład użycia:

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

Ma to tę zaletę, zachowując istniejący URL params URL może już zawierać.

6

Zamiast:

redirect_to some_params 

można zrobić:

redirect_to url_for(some_params) 

Ty obracając params w URL z url_for przed przekazaniem go do redirect_to, więc co można przejść redirect_to kończy się adres URL w postaci ciągu znaków, do którego przekierowanie jest chętnie przekierowywane.

Notatka dobrze: Nie rozumiem, dlaczego redirect_to odmawia użycia parametrów. Kiedyś chętnie korzystał z params. W niektórych punktach ktoś dodał coś do Railsów, żeby to zabronić. Podejrzewam, że istnieją ku temu powody bezpieczeństwa, a jeśli tak, to przyczyny bezpieczeństwa mogą oznaczać, że ręczne wykonanie ma również wpływ na bezpieczeństwo. Ale nie udało mi się znaleźć żadnej dokumentacji wyjaśniającej, co tu jest.

aktualizacja: Znalazłem ostrzeżenia o zabezpieczeniach, ale nie trawi go jeszcze: https://github.com/rails/rails/pull/16170