2016-06-22 9 views
1

Dies ist eine rein Ruby-Syntax-Frage, obwohl es im Kontext von Rails ist.String-Verkettung und Yield-Block basierend auf If-Modifikator

Ich habe eine Methode, die einen Block übernimmt und wandelt es in seiner Definition proc Objekt:

def wrapper(form, attr, options = {}, &block) 
    if block_given? 
    yield(block) + 
    end 
    form.label(form_label, class: "control-label") 
end 

der Block ein Stück HTML als String ist, und ich möchte es mit form.label verketten die selbst wird als eine Zeichenfolge von HTML zurückgegeben. Ich möchte jedoch nur die beiden verketten, wenn der Block gegeben ist.

Die oben erzeugt Syntaxfehler:

SyntaxError: (irb):14: syntax error, unexpected keyword_end 

Mit dem if-Modifikator funktioniert auch nicht:

def wrapper(form, attr, options = {}, &block) 
    yield(block) + if block_given? 
    form.label(form_label, class: "control-label") 
end 

Ich könnte auch später so etwas wie dies tun müssen (in diesem Fall I 3 verketten Zeichenfolgen bedingt):

Was ist der beste Ansatz zum Verketten eines Blocks wit h eine Zeichenfolge, wenn der Block optional sein kann?

Eine Lösung, die ich dachte, nachdem die Frage zu stellen ist vielleicht dies:

def wrapper(form, attr, options = {}, &block)  
    if block_given? 
     content = capture(&block) 
    else 
     content = "" 
    end 

    form.label(form.object.errors[attr]) + content + form.label(form_label, class: "control-label") 
    end 
+0

Warum haben Sie die Argumente 'attr' und' options', wenn man bedenkt, dass sie nicht verwendet werden? Ist 'form_label' eine Methode? –

Antwort

2

Sie können keine Zeichenketten wie diese verketten. Die Zeile yield(block) + ist keine vollständige Zeile. Deshalb bekommst du die Fehler. Hier sind zwei mögliche Lösungen:

def wrapper(form, attr, options = {}, &block) 
    if block_given? 
    return yield(block) + form.label(form_label, class: "control-label") 
    end 
    form.label(form_label, class: "control-label") 
end 

Oder diese

def wrapper(form, attr, options = {}, &block) 
    content = '' 
    if block_given? 
    content = yield(block) 
    end 
    content + form.label(form_label, class: "control-label") 
end 
1

Du siehst einen Fehler, weil Sie einen baumelnden + innerhalb der linken Seite, wenn Block

Sie könnten so etwas wie dieses

tun
def wrapper(form, attr, options = {}, &block) 
    res = block_given? ? yield(block) : "" 
    res + form.label(form_label, class: "control-label") 
end 
Verwandte Themen