capture, blocks, and + operator

10 views
Skip to first unread message

John Merlino

unread,
Jul 25, 2011, 2:52:10 PM7/25/11
to Ruby on Rails: Talk
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

John Merlino

unread,
Aug 3, 2011, 6:59:42 PM8/3/11
to rubyonra...@googlegroups.com
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

7stud --

unread,
Aug 3, 2011, 7:55:18 PM8/3/11
to rubyonra...@googlegroups.com
The docs say this about content_tag:

==
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!")
# => <p>Hello world!</p>

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"}

--
Posted via http://www.ruby-forum.com/.

7stud --

unread,
Aug 3, 2011, 8:23:25 PM8/3/11
to rubyonra...@googlegroups.com
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.

Reply all
Reply to author
Forward
0 new messages