I''ve got a form with fields of this naming convention:
<Customer Info>
First Name: <input type="text"
name="customer[first_name]" ...
Last Name: <input type="text" name="customer[last_name]"
...
Address: <input type="text" name="customer[address_1]"
...
City: <input type="text" name="customer[city]" ...
State: <input type="text" name="customer[state]" ...
<Billing Info>
First Name: <input type="text"
name="billing_address[first_name]"...
Last Name: <input type="text"
name="billing_address[last_name]"...
Address: <input type="text"
name="billing_address[address_1]"...
City: <input type="text" name="billing_address[city]"...
State: <input type="text"
name="billing_address[state]"...
And I can successfully use params[:customer] to access all the
customer items and params[:billing_address] for the billing info. And
I can successfully use Hash(params[:customer]) to create a new
customer and populate a table. The problem I''m having is if they
identify that the billing info is the same as their customer info,
then I want to put the customer info into a billing hash to use to
update/create a record in the billing table. This code doesn''t work
for creating the hash (but doesn''t generate an error either):
begin
billing_address_hash = Hash.new()
if (params[:different_billing_info] == "1")
billing_address_hash.merge(params[:billing_address])
#puts("\nDifferent: ", billing_address_hash.to_s)
else
billing_address_hash.merge(params[:customer])
#puts("\nSame: ", billing_address_hash.to_s)
# Remove customer fields not found in the billing address
table
billing_address_hash.delete(''status'')
billing_address_hash.delete(''email'')
end
rescue
@error_message = "Unable to create billing address
hash.<br>"
@request_completed = false
return
end
It just returns the initialized new billing_address_hash as empty. If
I use Hash(params[:billing_address]) (or customer) in place for the
parameter for merge, an error occurs and the error message is
returned.
How do I get params[] data into a hash that the Hash merge method will
take as a parameter?
The reason I''m doing something like this is that I have additional
fields in the customer model that are not in the billing_address
model. I''m assuming if I try to pass all the customer fields into the
billing model, it will cause an error.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Jack wrote: :> > begin > billing_address_hash = Hash.new() > if (params[:different_billing_info] == "1") > billing_address_hash.merge(params[:billing_address]) > #puts("\nDifferent: ", billing_address_hash.to_s) > else > billing_address_hash.merge(params[:customer]) > #puts("\nSame: ", billing_address_hash.to_s) > # Remove customer fields not found in the billing address > table > billing_address_hash.delete(''status'') > billing_address_hash.delete(''email'') > end > rescue > @error_message = "Unable to create billing address hash.<br>" > @request_completed = false > return > end > > It just returns the initialized new billing_address_hash as empty. IfCan you try with merge! instead of merge ? Stephan # irb>> a = {:a => 1}; b = {:b => 2}=> {:b=>2}>> a.merge(b)=> {:b=>2, :a=>1}>> a=> {:a=>1}>> b=> {:b=>2}>> a.merge!(b)=> {:b=>2, :a=>1}>> a=> {:b=>2, :a=>1}>> b=> {:b=>2}>> ''good luck''-- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Thanks Stephan. You at least pointed me to the correct method. merge
returns a new hash, which I wasn''t saving. But merge! adds content to
the existing hash. I''m still getting an empty hash though using
something like this:
billing_address_hash = Hash.new()
begin
if (params[:different_billing_info] == "1")
billing_address_hash.merge!(Hash[params[:billing_address]])
logger.info("\nDifferent: ", billing_address_hash.to_s)
else
billing_address_hash.merge!(Hash[params[:customer]])
logger.info("\nSame: ", billing_address_hash.to_s)
# Remove customer fields not found in the billing address
table
billing_address_hash.delete(''uva_status'')
billing_address_hash.delete(''email'')
end
rescue
@error_message = "Unable to create billing address
hash.<br>"
@request_completed = false
return
end
which baffles me because I use Hash[params[:customer]] to pass the
form data to the customer model when creating a new one and it works
just fine.
On Feb 14, 3:25 pm, Stephan Wehner
<rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org>
wrote:> Jack wrote:
>
> :
>
>
>
>
>
> > begin
> > billing_address_hash = Hash.new()
> > if (params[:different_billing_info] == "1")
> > billing_address_hash.merge(params[:billing_address])
> > #puts("\nDifferent: ", billing_address_hash.to_s)
> > else
> > billing_address_hash.merge(params[:customer])
> > #puts("\nSame: ", billing_address_hash.to_s)
> > # Remove customer fields not found in the billing address
> > table
> > billing_address_hash.delete(''status'')
> > billing_address_hash.delete(''email'')
> > end
> > rescue
> > @error_message = "Unable to create billing address
hash.<br>"
> > @request_completed = false
> > return
> > end
>
> > It just returns the initialized new billing_address_hash as empty. If
>
> Can you try with merge! instead of merge ?
>
> Stephan
>
> # irb>> a = {:a => 1}; b = {:b => 2}
> => {:b=>2}
> >> a.merge(b)
> => {:b=>2, :a=>1}
> >> a
> => {:a=>1}
> >> b
> => {:b=>2}
> >> a.merge!(b)
> => {:b=>2, :a=>1}
> >> a
> => {:b=>2, :a=>1}
> >> b
> => {:b=>2}
> >> ''good luck''
>
> --
> Posted viahttp://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Jack wrote: If you post more controller code, that should make it easier to track down. Stephan -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Here''s the entire method that is when the form is submitted.
Everything up to the billing_address_hash works. (Note: Before adding
that section the last if construct, ie. @request.agency_id was
functioning successfully when it was passed
Hash[params[:billing_address]] as the last parameter. I needed to
change this in the event an external customer did not include a
separate billing address.)
# Save all the details entered for a request to the database, making
sure to flag the order as unapproved
def save_details
# Set a flag to determine if the request data is all good if this
method returns at the end
# without this value being modified.
@request_completed = true
@error_message = ''''
# Get the form customer contact information.
form_customer = Customer.new(Hash[params[:customer]])
# Get/create the department''s id to store in the customer record
form_department_name = params[:department_name]
form_customer.department_id Department.get_id(form_department_name)
# Identify how the customer heard about the service.
form_heard_about_service_other params[:heard_about_service_other]
form_customer.heard_about_service_id
HeardAboutService.existing_or_other_id(form_customer.heard_about_service_id,form_heard_about_service_other)
# Determine if this is a returning customer using the email
address. If so then
# update their existing information. Otherwise create a new
customer record.
existing_customer = Customer.find(:first, :conditions => ["email
= ?", form_customer.email])
begin
if (existing_customer != nil)
existing_customer.update_attributes!(Hash[params[:customer]])
existing_customer.update_attributes!({''department_id''
=>
form_customer.department_id, ''heard_about_service_id'' =>
form_customer.heard_about_service_id})
@customer = existing_customer
else
form_customer.save!
@customer = form_customer
end
rescue
# If any error occurs when saving the customer information then
the request submission fails
# since we need to be able to tie the request to a valid
customer record.
@error_message += "Customer information could not be
saved!<br>"
@request_completed = false
return
end
# Get the form''s general order request info.
@request = Request.new(Hash[params[:order]])
@request.is_approved = 0
# Assign the customer''s id to this new order
@request.customer_id = @customer.id
# Make sure the date due is formatted correctly before writing to
the table
# parsedate returns an array with year, month, day as first three
elements.
begin
date_due = ParseDate.parsedate(params[:order][:date_due],true)
@request.date_due Date.new(date_due[0],date_due[1],date_due[2]).to_s +
'' 17:00:00''
rescue # if an invalid date was entered set to nil
@request.date_due = nil
end
# Set the request date for the order to the current date and time
@request.date_request_submitted = Time.now.strftime("%Y-%m-%d %H:
%M:%S")
# Make sure that external customers have the availability set to
Public
if (@session[:computing_id] == ''External'')
@request.availability = ''Public''
end
# Create a new request/order record.
begin
@request.save!
rescue
# If the request cannot be saved to the order table then we
should not continue
@error_message += "Unable to create a new request at this
time.<br>"
@request_completed = false
return
end
# NOTE: Before attempting to use the billing fields, determine if
the billing info is different
# than the regular customer info. Because if the person
affiliation is external then the billing
# address will be empty by default and the different billing
address box not checked.
billing_address_hash = Hash.new()
begin
if (params[:different_billing_info] == "1")
billing_address_hash.merge!(Hash[params[:billing_address]])
logger.info("\nDifferent: ", billing_address_hash.to_s)
else
billing_address_hash.merge!(Hash[params[:customer]])
logger.info("\nSame: ", billing_address_hash.to_s)
# Remove customer fields not found in the billing address
table
billing_address_hash.delete(''status'')
billing_address_hash.delete(''email'')
end
rescue
@error_message += "Unable to create billing address
hash.<br>"
@request_completed = false
return
end
# If an agency was specified on the form then search/save the
billing info as agency related.
# Otherwise it should be related to the customer.
if (@request.agency_id != nil)
@billing_address
BillingAddress.update_or_create(''agency_id'',@request.agency_id,billing_address_hash)
logger.info("\nBilling address update using agency")
else
@billing_address
BillingAddress.update_or_create(''customer_id'',@request.customer_id,billing_address_hash)
logger.info("\nBilling address update using customer")
end
end
On Feb 14, 5:06 pm, Stephan Wehner
<rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org>
wrote:> Jack wrote:
>
> If you post more controller code, that should make it easier to track
> down.
>
> Stephan
>
> --
> Posted viahttp://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---