2009-11-04 11 views
6

eine schnelle Ruby-Frage für Sie:Wie verkette ich Hash-URL-Parameter?

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 

(Ich denke, ö so kodiert, entschuldigen Sie mich, wenn seine falsch) Gibt es einen einfacheren Weg, dies als die folgenden ?:

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

zu tun Ich versuche nicht, einen Krieg über die "beste" Art und Weise zu beginnen, dies zu tun - seine Methode scheint sehr klumpig und unrubinartig zu sein! Irgendwelche Tipps?

Antwort

21

Hier ist eine kürzere und effizientere Methode.

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

Seien Sie sicher, dass dies die Verwendung mit ' URI.escape' und nicht 'CGI.escape', weil das letztere' = 'in'% 3D' verwandelt. – Pesto

0

können Sie machen es ein wenig einfacher collect mit:

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

Ich weiß nicht, wie viel mehr Sie es als vereinfachen kann. Beachten Sie auch, dass CGI.escape Leerzeichen in + konvertiert, nicht . Wenn Sie wirklich wollen , verwenden Sie stattdessen (Sie müssen natürlich require 'uri').

0

Sie wahrscheinlich

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

von rails documentation kopiert. Vergessen Sie nicht, die Kommentare über der Methodendefinition zu lesen.

3

Schienen tut dies für Sie.

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" 

die wäre decodiert: "ids [] = 1 & ids [] = 2 & query = Käse"

6

Verwendung .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

einfachste Methode ist dies, danke – user1735921

Verwandte Themen