collection_select is quoting my text_method text ?

I have a table that contains currencies I support which has the columns: id, ch (the character to display when showing currency) name (the human name of the currency ...)

This table is currently loaded with these values:

currencies:

   Name ch   -------- --------------   U.S.D $   Euro &euro   G.B.P. &pound

I created a method in my 'currency' model called 'menustr' which I use in collection_select to show the currency options:

  def menustr     return ch + " " + name   end

I then use this in my form template:

    <td><label for="customer_def_cur_pref">Default Currency: </label></td>     <td><%= collection_select("customer", :def_cur_pref, @zcurtype, :ch, :menustr) %></td>

where @zcurtype is an array containing all the currencies in the currencies table.

Instead of putting the pretty html version of &pound and &euro in my pull down menu, collection_select's form is quoting them and I still see the "&pound" and "&euro" text.

Anyone have a way to work around this?

Thanks!

dmack wrote:

I have a table that contains currencies I support which has the columns: id, ch (the character to display when showing currency) name (the human name of the currency ...)

This table is currently loaded with these values:

currencies:

   Name ch   -------- --------------   U.S.D $   Euro &euro   G.B.P. &pound

I created a method in my 'currency' model called 'menustr' which I use in collection_select to show the currency options:

  def menustr     return ch + " " + name   end

I then use this in my form template:

    <td><label for="customer_def_cur_pref">Default Currency: </label></td>     <td><%= collection_select("customer", :def_cur_pref, @zcurtype, :ch, :menustr) %></td>

where @zcurtype is an array containing all the currencies in the currencies table.

Instead of putting the pretty html version of &pound and &euro in my pull down menu, collection_select's form is quoting them and I still see the "&pound" and "&euro" text.

Append a semicolon to the values in your table that are HTML symbols.

Mark Reginald James wrote:

dmack wrote: > I have a table that contains currencies I support which has the > columns: > id, > ch (the character to display when showing currency) > name (the human name of the currency ...) > > This table is currently loaded with these values: > > currencies: > > Name ch > -------- -------------- > U.S.D $ > Euro &euro > G.B.P. &pound > > I created a method in my 'currency' model called 'menustr' which I use > in collection_select to show the currency options: > > def menustr > return ch + " " + name > end > > I then use this in my form template: > > <td><label for="customer_def_cur_pref">Default Currency: > </label></td> > <td><%= collection_select("customer", :def_cur_pref, @zcurtype, > :ch, :menustr) %></td> > > where @zcurtype is an array containing all the currencies in the > currencies table. > > Instead of putting the pretty html version of &pound and &euro in my > pull down menu, collection_select's form is quoting them and I still > see the "&pound" and "&euro" text.

Append a semicolon to the values in your table that are HTML symbols.

Thanks for the response. I have the semi-colon on the end of my values for 'ch' in my currencies table. If I list my table using the default scaffolding, I get what I want:

Listing currencies (sorry for the formatting) Name Ch Menustr Actions USD $ $; USD Show Edit Destroy Euro € €; Euro Show Edit Destroy GBP £ £; GBP Show Edit Destroy

However, when I populate a pull-down menu using collection_select, the symbol reverts back to either &pound or &euro which doesn't look as pretty :frowning:

My controller does this:

def new     @customer = Customer.new     @zcurtype= Currency.find(:all) end

and the chunk in the form template does this for the pull-down:

  <label for="customer_def_cur_pref">Default Currency: </label></td>   <%= collection_select("customer", :def_cur_pref, @zcurtype, :ch, :menustr) %>

... Looking at the generated html, you can see the &amp ... prefixes on the code plus the extra semi-colon I added to see if it would help :slight_smile:

   <label for="customer_def_cur_pref">Default Currency: </label>    <select id="customer_def_cur_pref" name="customer[def_cur_pref]">      <option value="$" selected="selected">$; USD</option>      <option value="&amp;euro;">&amp;euro;; Euro</option>      <option value="&amp;pound;">&amp;pound;; GBP</option>    </select>

dmack wrote:

Thanks for the response. I have the semi-colon on the end of my values for 'ch' in my currencies table. If I list my table using the default scaffolding, I get what I want:

Listing currencies (sorry for the formatting) Name Ch Menustr Actions USD $ $; USD Show Edit Destroy Euro € €; Euro Show Edit Destroy GBP £ £; GBP Show Edit Destroy

However, when I populate a pull-down menu using collection_select, the symbol reverts back to either &pound or &euro which doesn't look as pretty :frowning:

Yes, the Rails select options builder is calling html_escape on the option texts and values.

You'll either have to build your html options manually, or override the html_escape method.

Mark Reginald James wrote:

Yes, the Rails select options builder is calling html_escape on the option texts and values.

You'll either have to build your html options manually, or override the html_escape method.

Aha... So collection_select escapes html. That explains it. I will use your suggestion and build up the option lists manually.

Too bad we can't pass an :escape => false or something to collection_select.

Thank you!

Dan

Mark Reginald James wrote:

Yes, the Rails select options builder is calling html_escape on the option texts and values.

You'll either have to build your html options manually, or override the html_escape method.

Mark,

You are correct. I didn't know that it did that until now but now I do. It's too bad we can't pass an :escape => false or something to collection_select.

Thank you for you help,

Dan

dmack wrote:

Aha... So collection_select escapes html. That explains it. I will use your suggestion and build up the option lists manually.

Too bad we can't pass an :escape => false or something to collection_select.

Good idea. While the value tag of the option must be escaped (see http://dev.rubyonrails.org/ticket/2011), the option text is html, and that need not be escaped. I'll submit a patch.