table helper not rendering table

Hey all,

layout_helper.rb:

  def table(collection, header_names, fields, class_name)       return false unless collection.any?       table_str = ""   table_str += "<table id=\"" + class_name + "\" class=\"" + class_name + "\">\n"     table_str += "\t<thead>\n"       table_str += "\t\t<tr>\n"         header_names.each do |name|           table_str += "\t\t\t<th>"           table_str += name           table_str += "</th>\n"         end       table_str += "\t\t</tr>\n"     table_str += "\t</thead>\n"     table_str += "\t<tbody>\n"       collection.each do |col|         table_str += "\t\t<tr>\n"           fields.each do |name|             table_str += "\t\t\t<td>\n"               table_str += col[name].to_s             table_str += "\t\t\t</td>\n"           end         table_str += "\t\t</tr>\n"       end     table_str += "\t</tbody>\n"   table_str += "</table>\n"

   end

users_controller.rb:

  def index     @users = User.find(:all,:order => 'id ASC')     @headers = ["id","Email","Name","Company","Telephone"]     @fields = [:id, :email,:last_name,:company,:telephone]   end

users/index.html.erb: <%= table(@users, @headers, @fields,'table_class') %>

What the above does is render a big string of what I am wanting to display as html markup. If I add puts(table_str) to the helper method, then nothing gets rendered on the page.

Any idea what I am doing wrong?

Thanks for response.

Hey all,

layout_helper.rb:

def table(collection, header_names, fields, class_name) return false unless collection.any? table_str = "" table_str += "<table id=\"" + class_name + "\" class=\"" + class_name + "\">\n" table_str += "\t<thead>\n" table_str += "\t\t<tr>\n" header_names.each do |name| table_str += "\t\t\t<th>" table_str += name table_str += "</th>\n" end table_str += "\t\t</tr>\n" table_str += "\t</thead>\n" table_str += "\t<tbody>\n" collection.each do |col| table_str += "\t\t<tr>\n" fields.each do |name| table_str += "\t\t\t<td>\n" table_str += col[name].to_s table_str += "\t\t\t</td>\n" end table_str += "\t\t</tr>\n" end table_str += "\t</tbody>\n" table_str += "</table>\n"

end

users_controller.rb:

def index @users = User.find(:all,:order => 'id ASC') @headers = ["id","Email","Name","Company","Telephone"] @fields = [:id, :email,:last_name,:company,:telephone] end

users/index.html.erb: <%= table(@users, @headers, @fields,'table_class') %>

What the above does is render a big string of what I am wanting to display as html markup. If I add puts(table_str) to the helper method, then nothing gets rendered on the page.

Any idea what I am doing wrong?

Have you checked that your table method is actually being called (eg by sticking a breakpoint in it or some calls to Rails.logger.info) ?

Fred

Frederick Cheung wrote in post #988214:

Frederick Cheung wrote in post #988214:

>> table_str += "\t\t<tr>\n" >> fields.each do |name|

>> What the above does is render a big string of what I am wanting to >> display as html markup. If I add puts(table_str) to the helper method, >> then nothing gets rendered on the page.

>> Any idea what I am doing wrong?

> Have you checked that your table method is actually being called (eg > by sticking a breakpoint in it or some calls to Rails.logger.info) ?

> Fred

Im pretty sure it gets called because it outputs html as one huge string e.g. '<table><th>Item</th>' and one long string displays in the browser. That's when I don't add puts at the end of the helper method. When I add puts and pass in the concatenated string, nothing gets displayed at all.

Oops, had missed the comment about the output you get. Sticking in puts suppresses all output because the result of puts is always nil. You're seeing the html because rails automatically escape html for you these days. You can call html_safe on a string to mark it as not needing escaping (although that shifts the responsibility of checking that things are indeed safe to you )

Fred

You're seeing the html because rails automatically escape html for you these days. You can call html_safe on a string to mark it as not needing escaping (although that shifts the responsibility of checking that things are indeed safe to you )

Fred

Thanks it worked!