capture, blocks, and + operator

Hey all,

Let's say we have this:

#view = section "Contact" do   - field_list :class => "contacts-view" do |v|     = v.item "Contact Type", @contact.contact_type

#helper   def section(*args, &block)     label = String === args.first ? args.first : String === args.second ? args.second : nil     klass = "#{klass} #{type ? type.to_s.dasherize : nil}".strip.presence

    content = block ? capture(&block).html_safe : ""

    return "" if content.blank?

    content = content_tag(:legend, label) + content if label.present?     content_tag :fieldset, content, :class => klass, :id => options.delete(:id)   end

1) From what I read, passing a block into the rails capture method will capture a block of html, so you can append/prepend other html to it. But what does capture a block of html mean? Why wouldnt you be able to append/prepend html to it otherwise?

2) I am not sure what the + operator is doing here: content_tag(:legend, label) + content Obviously, the content_for rails method wraps the string held in label around legend tags. content local variable holds the html that was created in the block passed into this iterator. But does the + operator mean that we are prepending that html onto the legend tag html?

thanks for response

My understanding of the + operator is as follows. The + operator works differently with arrays than it does with scalar values. With arrays, when taking two arrays as operands, it returns an array containing everything in the two oeprand arrays. In essence, + operator performs addition on scalar types and union on arrays. For string, it does string concatenation. But what it does with blocks of html, such as what is returned by content_tag, I would like to know.

thanks for response

The docs say this about content_tag:

John Merlino wrote in post #1014812:

My understanding of the + operator is as follows. The + operator works differently with arrays than it does with scalar values. With arrays, when taking two arrays as operands, it returns an array containing everything in the two oeprand arrays. In essence, + operator performs addition on scalar types and union on arrays. For string, it does string concatenation.

Yes, that's all correct. + is just a strange name for a ruby method. If you write:

"hello" + " world"

That is equivalent to:

"hello".+("world")

That may look confusing but suppose you were calling a method like split:

"hello,world".split(",")

That is the exact same format as the + method call:

obj.meth_name(arg)

But what it does with blocks of html

That's not what the docs mean about the return value of content_tag. In html, the term 'block tag' has a specific meaning. The docs aren't describing the return value, which is actually a String. Good docs list the return type of a method because that is one of the most important things you can know about a method in addition to the argument types.