Mixing html tags and Ruby blocks

I’m trying to get the following idea to work:

<%= @column_names.each { |t|

t.downcase
@listing.send(t.downcase) } %>

Essentially I want to display a form that has a left and right TD, with
the left TD being a column name and the right TD being the column data.

If there’s a better way (the Rails way ?), I’m all ears (and half elf
too.)

Matt

And while were at it, could someone explain why the difference in Ruby /
ERB?

a = [ “a”, “b”, “c” ]
a.each {|x|} => no result

vs.

<% arr=[“a”, “b”, “c” ] %>
<%= arr.each {|x|} %> => results in ‘abc’

I thought I had a solution worked out, but the arr.each is adding stuff
i can’t use.

Matt

Well actually I’ve read the PickAxe, the new Ecomm book, Agile, numerous
Tutorials and even watched a few screencasts. My previous experience is
in Aerospace/Defense writing specialized C++ and flex/bison programs.
I’m not a programming Noob.

Actually I thought my question was quite intelligent. There is a
definite difference in the way that ERB / Ruby handles this simplistic
case, and none of the books I’ve read highlighted that as a major
sticking point.

Your reply is only arrogant because you really didn’t answer the
question. Your reply is a lot like the books on this subject…empty.

So how about finishing up your reply on why the ERB solution is printing
out the “abc” when I haven’t given it a puts or print call

Matt

matt wrote:

And while were at it, could someone explain why the difference in Ruby /
ERB?

a = [ “a”, “b”, “c” ]
a.each {|x|} => no result
If you are doing this in Ruby, then it won’t print anything. Because you
are not printing anything!!

vs.

<% arr=[“a”, “b”, “c” ] %>
<%= arr.each {|x|} %> => results in ‘abc’

ERB is meant to generate HTML/Text, when used within <%= %>, so above
code works.

I suggest, you read some Ruby books. PickAxe2 is a good book, but it
assumes some previous programming experience so you can read David
Black’s Ruby for Rails. Don’t consider this reply as an arrogant reply.
But you really need to read stuff, you can’t push everything to the
mailing list.

<%= @column_names.each { |t|

t.downcase
@listing.send(t.downcase) } %>
Do a favor, do not write code like this in your views.

Sorry, I forgot to tell the book name, chapter 4 in Agile Web
Development with Rails.

Dude, ERB only print something if you add ‘=’ signal …

<%=

You should stop reading books in a vertical way, since the difference
between <% %> and <%= %> is explained in Chapter 4.

Is not the reading quantity that matters…

On 27/12/2006, at 5:48 PM, matt wrote:

And while were at it, could someone explain why the difference in
Ruby /
ERB?

a = [ “a”, “b”, “c” ]
a.each {|x|} => no result

In irb:

irb(main):001:0> a = [ “a”, “b”, “c” ]
=> [“a”, “b”, “c”]
irb(main):002:0> a.each {|x|}
=> [“a”, “b”, “c”]

So it doesn’t give you no result. The “each” method returns whatever
it’s being asked to iterate over, which in this case is an array. Of
course using each like this is pointless as you’re iterating over the
array, performing a no-op on each element, and then returning the
original array.

<% arr=[“a”, “b”, “c” ] %>
<%= arr.each {|x|} %> => results in ‘abc’

Exactly the same thing happens here, except erb then takes the
returned array, sticks the elements together as a string and spits
out the result.

If you want to iterate over the array without printing the result,
use “<% … %>” rather than “<%= … %>”.

Cheers,

Pete Y.

On 27/12/2006, at 5:20 PM, matt wrote:

I’m trying to get the following idea to work:

<%= @column_names.each { |t|

t.downcase
@listing.send(t.downcase) } %>

You could try:

<% @column_names.each do |t| %>

<%=h t.downcase %> <%=h @listing.send(t.downcase) %> <% end %>

If it’s an ActiveRecord object you’re talking about, “@listing[t]”
will be neater than the send.

Cheers,

Pete Y.

Hi –

On Wed, 27 Dec 2006, matt wrote:

Well actually I’ve read the PickAxe, the new Ecomm book, Agile, numerous
Tutorials and even watched a few screencasts. My previous experience is
in Aerospace/Defense writing specialized C++ and flex/bison programs.
I’m not a programming Noob.

Just to clarify: “Ruby for Rails” isn’t specifically for people who
are new to programming. It’s for Rails developers who want to know
what they’re actually doing :slight_smile: I think a new programmer with a sense
of adventure, and a willingness to dig deeper as and when needed,
will do very well with it. But that’s not the only or even the
principal readership.

And while were at it, could someone explain why the difference in Ruby /
ERB?

a = [ “a”, “b”, “c” ]
a.each {|x|} => no result

vs.

<% arr=[“a”, “b”, “c” ] %>
<%= arr.each {|x|} %> => results in ‘abc’

The ingredients you need to understand this are:

  1. <%= stuff %> interpolates a string representation of stuff
    into the ERb output stream.
  2. each is not the same as map/collect.
  3. each returns its receiver.

The default string representation of an array is a string-based join.
For [“a”, “b”, “c”] it’s “abc”. So, by doing:

<%= arr.each {|x| } %>

you’re telling ERb to interpolate “abc” into the output stream.

Your reply is only arrogant because you really didn’t answer the
question. Your reply is a lot like the books on this subject…empty.

Let’s be fair. The Pickaxe documents the return value of Array#each,
and that documentation has made its way into ri:

  array.each {|item| block }   ->   array

“Ruby for Rails” talks at some length (page 244) about the return
value of each, particularly in comparison with the return value of
map. It also talks about ERb and the <%= %> delimiter, around page
30. And AWDWR, of course, talks a lot about ERb.

It’s perfectly reasonable to ask about what’s happening, but no one’s
hiding all this stuff from you :slight_smile:

David


Q. What is THE Ruby book for Rails developers?
A. RUBY FOR RAILS by David A. Black (Ruby for Rails)
(See what readers are saying! http://www.rubypal.com/r4rrevs.pdf)
Q. Where can I get Ruby/Rails on-site training, consulting, coaching?
A. Ruby Power and Light, LLC (http://www.rubypal.com)

OK. First off, I want to apologize for my irresponsible response. It
wasn’t fair of me to be so harsh for being told to go read more. I was
tired, and should have left the keyboard alone, but that isn’t your
problem, it’s mine.

Next, my original question sparked a secondary question while I was
figuring out the solution on my own. The secondary question being the
ERB vs Ruby question

That question was one of ‘principle’ and ‘theory’, not of practicality.
I was trying to understand the ‘why’, not the ‘I broke this, help me fix
it’ type of question.

David summed it up well, that ‘each’ returns it’s reciever, and his book
(which I just got ahold of this morning for reference), summed up the
same thing. And the output of the reciever in a ruby script prints
nothing, while the output of ERB is to spit out the text of the
reciever.

I agree that there is a lot of documentation out there to read, but for
me, there is still a lot that is uncorrellated (like each/erb) that I
think is fair game to ask as a question.

The original responder said that I needed to read more and not ask
questions that are readily available. I don’t believe that the answer to
this question was ‘readily available’

David, you called me on the carpet and you are right. The books do
cover ERB, however, as I read them, they didn’t seem to answer my
question, because they didn’t cover or warn about printing the return
value of something like each.

Again, I apologize for running astray with my response, and I hope you
can forgive me for such a stretch of temp insanity.

And thank you everyone for being genuinely concerned enough to respond,
and clear this up.

Matt

Thanks. That’s what I needed.

But I couldn’t get the @listing[t] to work. No errors, but it didn’t
display anything either.

Thanks again

Matt