What is the right way to access this param value?

L

laredotornado

Hi,

I have several fields on my page, distinguished by numbers in the id:

<% for i in 1 .. 5 %>
<tr><td>
<table>
<tr>
<td><%=
text_field_tag("prescription_number" + i.to_s, "") %></td>
<td><%= text_field_tag("description" +
i.to_s, "") %></td>
</tr>
<tr>
<td align="center">Prescription
Number</td>
<td align="center">Description</td>
</tr>
</table>
</td></tr>
<% end %>

However, when I try and access the values in my controller,

i = 0
while params[:prescription_number + i.to_s] != nil and
params[:description + i.to_s] != nil # line 7
session[:prescription_number + i.to_s] =
params[:prescription_number + i.to_s]
session[:description + i.to_s] =
params[:description + i.to_s]
i += 1
end

I get the error

NoMethodError in OrderController#confirm
undefined method `+' for :prescription_number:Symbol
RAILS_ROOT: ./script/../config/..
Application Trace | Framework Trace | Full Trace
/usr/local/apache2/htdocs/easyrx/app/controllers/order_controller.rb:
7:in `confirm'

What is the correct way to access my parameter values?

Thanks, - Dave
 
Z

zetetic

Hi,

I have several fields on my page, distinguished by numbers in the id:

<% for i in 1 .. 5 %>
<tr><td>
<table>
<tr>
<td><%=
text_field_tag("prescription_number" + i.to_s, "") %></td>
<td><%= text_field_tag("description" +
i.to_s, "") %></td>
</tr>
<tr>
<td align="center">Prescription
Number</td>
<td align="center">Description</td>
</tr>
</table>
</td></tr>
<% end %>

However, when I try and access the values in my controller,

i = 0
while params[:prescription_number + i.to_s] != nil and
params[:description + i.to_s] != nil # line 7
session[:prescription_number + i.to_s] =
params[:prescription_number + i.to_s]
session[:description + i.to_s] =
params[:description + i.to_s]
i += 1
end

I get the error

NoMethodError in OrderController#confirm
undefined method `+' for :prescription_number:Symbol
RAILS_ROOT: ./script/../config/..
Application Trace | Framework Trace | Full Trace
/usr/local/apache2/htdocs/easyrx/app/controllers/order_controller.rb:
7:in `confirm'

What is the correct way to access my parameter values?

Thanks, - Dave

You're trying to concatenate a Symbol with a string. This IRB session
should help explain the difference:

irb(main):019:0> "Hello".class
=> String
irb(main):020:0> "Hello".intern
=> :Hello
irb(main):021:0> :Hello.class
=> Symbol
irb(main):022:0> :Hello + " World"
NoMethodError: undefined method `+' for :Hello:Symbol
from (irb):22
irb(main):023:0> :Hello.to_s + " World"
=> "Hello World"
 
R

Rob Biedenharn

Hi,

I have several fields on my page, distinguished by numbers in the id:

<% for i in 1 .. 5 %>
<tr><td>
<table>
<tr>
<td><%= text_field_tag("prescription_number" + i.to_s,
"") %></td>
<td><%= text_field_tag("description" + i.to_s, "") %></td>
</tr>
<tr>
<td align="center">Prescription Number</td>
<td align="center">Description</td>
</tr>
</table>
</td></tr>
<% end %>

However, when I try and access the values in my controller,

i = 0
while params[:prescription_number + i.to_s] != nil and
params[:description + i.to_s] != nil # line 7
session[:prescription_number + i.to_s] =
params[:prescription_number + i.to_s]
session[:description + i.to_s] =
params[:description + i.to_s]
i += 1
end

I get the error

NoMethodError in OrderController#confirm
undefined method `+' for :prescription_number:Symbol
RAILS_ROOT: ./script/../config/..
Application Trace | Framework Trace | Full Trace
/usr/local/apache2/htdocs/easyrx/app/controllers/order_controller.rb:
7:in `confirm'

What is the correct way to access my parameter values?

Thanks, - Dave

You're trying to concatenate a Symbol with a string. This IRB session
should help explain the difference:

irb(main):019:0> "Hello".class
=> String
irb(main):020:0> "Hello".intern
=> :Hello
irb(main):021:0> :Hello.class
=> Symbol
irb(main):022:0> :Hello + " World"
NoMethodError: undefined method `+' for :Hello:Symbol
from (irb):22
irb(main):023:0> :Hello.to_s + " World"
=> "Hello World"

While that is a valid explanation of the error, the real problem is
better solved with:

<% for i in 1 .. 5 %>
<tr><td>
<table>
<tr>
<td><%= text_field_tag("prescription_number[]", "") %></td>
<td><%= text_field_tag("description[], "") %></td>
</tr>
<tr>
<td align="center">Prescription Number</td>
<td align="center">Description</td>
</tr>
</table>
</td></tr>
<% end %>

Note the addition of the "[]" at the end of the name. If you need to
have an id on these, too, then add an :id=>"my_id" to the
text_field_tag.

Then you get back the parameter values in an Array and in the
controller can do something like:

params[:prescription_number].each_with_index do |
prescription_number, i|
break if prescription_number.blank? || params[:description]
.blank?
(session[:prescription_number] ||= []) = prescription_number
(session[:description] ||= []) = params[:description]
end

The '||= []' part is to initialize the value of the session hash to be
an empty Array if it starts nil.

Having said this, I'd recommend that you consider creating a model to
hold this data and then you just have one object to store in the
session (if you really have to do that, of course). This model does
not have to be backed by ActiveRecord. (Note that I'm going out on a
limb assuming that you're using Rails even though you've asked in the
Ruby list ;-)

-Rob

Rob Biedenharn http://agileconsultingllc.com
(e-mail address removed)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top