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.