Forum: Ruby on Rails Cookies & gsub ?

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
3319ab6fb19fcf97c8a3d66b8a9b68bf?d=identicon&s=25 Josh on Rails (Guest)
on 2006-03-06 23:55
(Received via mailing list)
I'm looking to store the current params into a/some cookie(s).

This works:

@params.each_pair do |this_index, this_param|
   cookies[this_index] = this_param

Except, I get session-only cookies. This doesn't work:

@params.each_pair do |this_index, this_param|
   cookies[this_index] = {
      :value => this_param,
      :expires => 30.days.from_now

Specifcally, I get the error:

> private method `gsub' called for ["Sonic", "0"]:Array

I'm not entirely sure I understand why one of these works, but the other
doesn't. Can someone point me in the right direction here?
3319ab6fb19fcf97c8a3d66b8a9b68bf?d=identicon&s=25 Josh on Rails (Guest)
on 2006-03-07 16:14
(Received via mailing list)
I've been poking around with this. I'm starting to think this may be a
minor bug in the cookie module... Here's what I've got now:

I'm converting an older app from PHP to Rails. The users makes a few
choices and I display/filter the data to match their choices. I want
to store their choices in a cookie, so they remain "stuck" the next
time the visitor returns to the site.

The problem: Storing a Hash in the cookie with an expiration gives a
"NoMethodError" -- not finding "gsub" on the Hash/Array (?).

More specifically:
The user makes a choice as to which book to search in, the source list
comes from the database, and uses abbreviations to track which source
is selected. I converted this almost straight from PHP:

<% @optional_sources.each do |this_source| -%>
<input type="checkbox" name="add_sources[]"
value="<%=this_source.abbrev%>" id="<%=this_source.abbrev%>"<%=
'checked="checked"' if
@cookies['add_source'].index(this_source.abbrev) %> /> <label
for="<%=this_source.abbrev%>"><></label><br />
<% end -%>

This returns a @params array like this:

@params['add_sources'] = [ 'ABBREV1', 'ABBREV2', 'ABBREV3' ]

Of course, this isn't a very "Railsian" approach. So I implemented the
next set of choices (let's say, choosing a city) using the check_box

    cities = %w{ Toronto Chicago }
    cities.each do |this_city|
<li> <%= check_box ("cities", this_city) %> <label
for="elements_<%=this_city%>"><%=this_city%></label> </li>
<% end -%>

Which produces a @params hash like this:

@params['cities']['Toronto'] = 0
@params['cities']['Chicago'] = 1

Or, to put it another way, like this:

@params['cities'] = { 'Toronto' => 0, 'Chicago' => 1 }

The problem (at long last):
In the first case (sources), this works fine:

cookies[:sources] = { :value => @params[:add_sources], :expires =>
30.days.from_now }

In the second case (cities), this DOES work:

cookies[:cities] = @params[:cities]

BUT, creates a this-session-only cookie. Trying to set an expiration:

cookies[:sources] = { :value => @params[:cities], :expires =>
30.days.from_now }

... produces the gsub error.
F10f95926f620318a71c102f207649b7?d=identicon&s=25 Manish Shah (Guest)
on 2006-04-05 03:00
(Received via mailing list)
in the rails book it says cookie values can only have string types
you'll run into the gsub error.  Agile Rails page 312

you might want to stringify your hash and store it in the cookie.  Then
extracting it, parse it back into your hash object.
This topic is locked and can not be replied to.