2017-01-22 4 views
2

Ich habe zwei Formularfeldtypen (f.text_field oder f.text_area), die ich durch einen Helfer definieren will:Können Sie ein _tag als ein Rails-Helfer-Argument übergeben?

def helper_thing(tagtype, field_id) 
    tagtype("#{field_id}", class: 'input-group-field') 
end 

Ich möchte, entweder für Formulartext helper in der Ansicht tagtype als eine Variable verwenden (unter Verwendung von haml):

= helper_thing(f.text_field, 'random_id') 

ich hoffe, der Ausgang wäre so etwas wie:

f.text_field('random_id') 

ich ein immer erhalten Fehler, der "ungültige Anzahl von Argumenten 0 von 1..3" sagt, verursacht im Wesentlichen den Rest meiner Argumente, um zu scheitern. Aus Gründen der Kürze habe ich nur ein Argument in meinem Beispiel verwendet.

Was versuche ich zu tun?

Antwort

2

Ja, es ist möglich:

def helper_thing(form, tagtype, field_id) 
    form.send(tagtype, "#{field_id}", class: 'input-group-field') 
end 

Call:

= helper_thing(f, :text_field, 'random_id') 

Das Problem mit dem Versuch war, dass man in f.text_field passieren versucht, die auf f ein Aufruf der text_field Methode ist ohne Argumente. Da diese Methode 1-3 Argumente erwartet, haben Sie den Fehler, den Sie gesehen haben.

0

Neben Michael Kohls ausgezeichnete Antwort gibt es eine zusätzliche Möglichkeit, dies zu tun, ohne die Methodensignatur zu ändern.

Seit Pars sind optional in Ruby alle Objekte verfügen über eine spezielle method Methode, die verwendet werden können, wenn Sie einen Verweis auf eine Methode wollen - ohne sie zu nennen:

= helper_thing(f.method(:text_field), 'random_id') 

Dann .call auf dem Method-Objekt übergeben verwenden:

+0

Sie möchten vielleicht einen benutzerdefinierten Formular-Generator erstellen, anstatt einen Helfer zu verwenden. Sie können Methoden zum 'f' Objekt hinzufügen, anstatt eine Reihe von Referenzen zu übergeben. http://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html – max

Verwandte Themen