2016-06-22 11 views
1

これはRailsの文脈であっても純粋にルビー構文の質問です。修飾子に基づいた文字列の連結と収穫ブロック

Iブロックを受け入れ、その定義にPROCオブジェクトに変換する方法があります

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

ブロックは文字列としてHTMLの一部であり、Iはform.labelれるとそれを連結しますそれ自身はhtmlの文字列として返されます。しかし、ブロックが与えられれば、2つを連結したいだけです。

上記は、構文エラーを生成します。

修飾子はまた、動作しない場合を使用して
SyntaxError: (irb):14: syntax error, unexpected keyword_end 

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

私はまた後で、私は3を連結した場合にはこのような何かを(行う必要があります文字列を条件付きで連結する):

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

ブロックウィットhブロックがオプションの場合は文字列ですか?私は質問をした後に考え

一つの解決策は、多分これです:

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

なぜ、それらが使われていないと考えて、あなたは 'attr'と' options'の引数を持っていますか? 'form_label'はメソッドですか? –

答えて

2

あなたはそのような文字列を連結することはできません。行yield(block) +は完全な行ではありません。だからあなたはエラーを受けている。

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 

またはこの

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

あなたはこの

ような何かを行うことができますブロック

場合は、あなたの内側にぶら下がっ+を残したので、あなたがエラーを見ている:ここでは、2つの可能な修正がされています

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