2014-09-16 3 views
0

C'est le code source de HTTPClient:arguments de la méthode Ruby de transition

def post(uri, *args, &block) 
    request(:post, uri, argument_to_hash(args, :body, :header, :follow_redirect), &block) 
end 

J'ai fait suite emballage:

def post(uri, *args, &block) 
    http.post(uri, args, &block) 
rescue Exception => ex 
    log_exception ex 
end 

et essayer de passer des paramètres:

httpclient.post 'url', xml_data, 'Content-Type' => 'application/xml' 
my_proxy.post 'url', xml_data, 'Content-Type' => 'application/xml' 

En premier cas HttpClient reçoit les arguments suivants:

[ 
    "my xml text", 
    {"Content-Type"=>"application/xml"} 
] 

En second cas:

[ 
    [ 
    "my xml text", 
    {"Content-Type"=>"application/xml"} 
    ] 
] 

Comment passer des arguments de la bonne manière?

Répondre

1
def post(uri, *args, &block) 
    http.post(uri, *args, &block) 
    # ... 

Notez l'astérisque dans la deuxième ligne (ou l'absence de celui-ci, dans votre code). C'est l'opérateur "splat", qui décompresse les tableaux en arguments séparés dans les appels de méthode, et place les arguments dans un tableau dans les définitions de méthode. Vous empaquetez des arguments dans votre définition de méthode (donc votre args est un tableau d'arguments), mais passez ce tableau à post, qui n'attend pas de tableau, sans le décompresser.

0

Je pense

def proxy(uri, *args, &block) 
    http.post(uri, *args, &block) 
    # ... 

devrait faire l'affaire, essentiellement "unsplatting" (* est l'opérateur de floc) le args-tableau.

Questions connexes