2012-06-10 13 views
7

Wie kann ich einen Hash-Code zu einem Array *args in Rails hinzufügen? Ich möchte nicht auf den ursprünglichen Wert stampfen, wenn einer existiert.Wie füge ich einen Hash zu * args hinzu?

Zum Beispiel habe ich eine Methode, die ein Array empfängt:

def foo(*args) 
    # I want to insert {style: 'bar'} into args but only if !style.present? 
    bar(*args)        # do some other stuff 
end 

Ich habe angefangen von Schienen die extract_options und reverse_merge Methoden:

def foo(*args) 
    options = args.extract_options!   # remove the option hashes 
    options.reverse_merge! {style: 'bar'} # modify them 
    args << options       # put them back into the array 
    bar(*args)        # do some other stuff 
end 

Es funktioniert aber scheint ausführlich und nicht sehr rubinisch. Ich habe das Gefühl, etwas verpasst zu haben.

+1

Gibt es einen Grund, warum Sie es wieder in die Liste der Argumente einfügen müssen? Ich glaube, dass die ersten beiden in der Rails-Quelle üblich sind. –

+1

Gute Frage. Ja, die Funktion 'foo' übergibt die Argumente an eine andere Funktion. Ich werde die Frage bearbeiten, um das zu zeigen. Ich schreibe eine FormBuilder-Klasse, viele Helfer rufen andere Helfer an. – IAmNaN

Antwort

7

Ja, #extract_options! ist der Weg, es in Rails zu tun. Wenn Sie eleganter sein möchten, müssen Sie es aliasieren oder Ihre eigene Art finden, mit diesem Bedürfnis umzugehen, oder nach einem Juwel von jemandem suchen, der es bereits getan hat.

+1

Vielen Dank, ich freue mich über das Feedback. – IAmNaN

Verwandte Themen