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

I don’t understand any of your rails code, but the docs say this about
content_tag:

==
content_tag(name, content_or_options_with_block = nil, options = nil,
escape = true, &block)

Returns an HTML block tag of type name surrounding the content.

Ok, not too helpful unless you understand the subtleties of css/html
speak. But the docs provide some examples that should help clarify
things:

content_tag(:p, “Hello world!”)

=>

Hello world!

Presumably, the html is a String–the return value doesn’t look like a
number or a method.

As for how blocks work: a block is really just a function. You write a
block in your code immediately after calling a method, and the method
captures the block in a variable. Then at some point the method calls
the block. Here is an example:

def some_method(str, &func)
if block_given?
puts func.call(str)
else
puts str
end
end

some_method(“John”) do |name|
“Hello #{name}”
end

–output:–
Hello John

The block is this part:

            do |name|
"Hello #{name}"

end

which can also be written as:

{ |name| “Hello #{name”}

Remember that in ruby a function/method returns the value of the last
expression that executed. So {‘hello’} is actually a function, which
just returns the String ‘hello’.

Knowing the output of the rails content_tag function and how blocks
work,
I can mimic the way content_tag works with my own method:

def my_content_tag(tag, &func)
if block_given?
puts “<#{tag}>#{func.call}</#{tag}>”
else
puts “something else”
end
end

my_content_tag(‘p’) do
“Hello world”
end

–output:–

Hello world

John M. 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)

In the case of the + method call, the name of the method is +

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 type of the return value, which is actually a String.
Good docs
would list the return type of a method because that is the most
important
thing to know about a method besides the argument types.