2009-11-04 12 views
6

szybkie Ruby pytanie do was:Jak połączyć parametry skrótu z adresem URL?

params = {:q => "A query",:foo => "bar",:nasty => "Schrödinger's cat"} 
p do_it(params) 
=> q=A%20query&foo=bar&nasty=Schr%C3%B6dinger%27s+cat 

(myślę ö koduje tak, wybacz mi, jeśli jej źle) Czy istnieje prostszy sposób to zrobić niż następujące ?:

def do_it(params) 
    out = [] 
    params.each_pair{|key,val| 
    out.push "#{CGI.escape(key.to_s)}=#{CGI.escape(val)}" 
    } 
    out.join("&") 
end 

Nie zamierzam rozpoczynać wojny o "najlepszy" sposób, aby to zrobić - ta właśnie metoda wydaje się bardzo kludgey i nie rubinowa! Jakieś wskazówki?

Odpowiedz

21

Oto krótsza i bardziej wydajna metoda.

def parameterize(params) 
    URI.escape(params.collect{|k,v| "#{k}=#{v}"}.join('&')) 
end 
+2

Pamiętaj, aby używać tego z ' URI.escape', a nie 'CGI.escape', ponieważ ten ostatni zamieni to' = 'w'% 3D'. – Pesto

0

Można zrobić to nieco prostsze przy użyciu collect:

def do_it(params) 
    params.collect do |key,val| 
    "#{CGI.escape(key.to_s)}=#{CGI.escape(val)}" 
    end.join('&') 
end 

Nie wiem, ile jeszcze można uprościć niż. Pamiętaj również, że CGI.escape przekształci spacje w +, a nie %20. Jeśli naprawdę chcesz %20, użyj zamiast tego URI.escape (będziesz musiał oczywiście require 'uri').

0

Powinieneś raczej spróbować następujących

def to_query(key) 
    "#{CGI.escape(key.to_s)}=#{CGI.escape(to_param.to_s)}" 
end 

skopiowany z rails documentation. Nie zapomnij przeczytać komentarzy powyżej definicji metody.

3

Rails robi to za Ciebie.

params = {:ids => [1,2], :query => 'cheese'} 
out = ActionController::Routing::Route.new.build_query_string(params) 
=> "?ids%5B%5D=1&ids%5B%5D=2&query=cheese" 

który dekodowane byłoby: "id [] = 1 & id [] = 2 & query = ser"

6

użycie .to_param

params = {:q => "A query",:foo => "bar",:nasty => "Schrödinger's cat"} 

params.to_param 
=> "foo=bar&nasty=Schr%C3%B6dinger%27s+cat&q=A+query" 
+0

najłatwiejszą metodą jest, dzięki – user1735921

Powiązane problemy