views:

30

answers:

1

I'm having an issue using a custom helper method in my Rails (3.0) app to output the required html.

I have the following call in my partial view: _label.html.erb

<% display_resource "Diamond", @resource.diamond %>

And in the resource_helper.rb file:

module ResourceHelper
   def display_resource(display_name, value)
      "<tr><td>#{display_name} </td><td>#{value.to_s}%</td></tr>" if value > 0
   end
end

The intended output is:

<tr>
  <td>Diamond</td>
  <td>15%</td>
<tr>

*granted, without the formatting, and the 15 is arbitrary

If I use the <%= ... %> when performing the method call, it'll output the string correctly, but it won't be html (ie I'll see "<tr><td>Diamond </td><td>15%</td></tr>" as opposed to "Diamond 15%")

What am I doing incorrectly?

+3  A: 

You need to mark the string returned as "raw" and then use <%= %>

module ResourceHelper
   def display_resource(display_name, value)
      raw("<tr><td>#{display_name} </td><td>#{value.to_s}%</td></tr>") if value > 0 # string wrapped in raw
   end
end
Rob Di Marco
I just migrated an app to Rails 3, and I'd like to ask: this is a new behavior in how Rails 3 treats HTML Safe strings, correct?
Robbie
@Robbie - I believe so - thus why I had this issue (but didn't know how to rectify it. Thanks for the help Rob!
MunkiPhD
Yes, this is the new way rails renders text. By default, all text rendered between <%= .. %> is escaped and you need to use raw() if you have some html that needs to be displayed
danengle