Saving multiple records from a single form

64 views
Skip to first unread message

Nasir Khan

unread,
Oct 11, 2006, 2:24:17 AM10/11/06
to rubyonra...@googlegroups.com
Usually a form maps to a AR instance (and hence a database row).
 
Consider the simple example of a Person model in which there is just one attribute "name".  [This is just an example to illustrate the problem]
 
Now I need a single form that allows multiple people to be added, basically multiple text fields (for "name" attribute) each resulting in a new ActiveRecord object for each person, but a single action and single submit button.
 
Another example would be multiple image upload from a single form [Flickr]
 
The way I am thinking of doing this is by having a model "People" that encapsulates many Person objects, on submit the controller method of Person shall iterate over its params and create as many Person objects as required. The People class though a model does not have a database table of its own.
 
My question : Is there a better way/pattern of doing this?
 
Thanks
 

Starr

unread,
Oct 11, 2006, 11:37:06 AM10/11/06
to Ruby on Rails: Talk
Hi Nasir,

You're making it too hard for yourself. Just do the iteration in the
controller, or make a method like "create_multiple" in your person
model.

Cheers
Starr

Paul Corcoran

unread,
Oct 11, 2006, 1:01:46 PM10/11/06
to Ruby on Rails: Talk
Hi Nasir,

Here is an example to accomplish what you are trying to do. The 'show'
method starts things rolling. The 'people' table has only 'id' and
'name' columns.

The Model (person.rb):
class Person < ActiveRecord::Base
end

The Controller (person_controller.rb):
class PersonController < ApplicationController

def show
end

def nbrOfNewPeople
3
end

def add_person
nbrOfNewPeople.times do | index |
person = Person.new
personParams = params[('person' + index.to_s).intern]
person.update_attributes(personParams) unless
personParams[:name].empty?
end
end

end


The View (show.rhtml)
<%= form_tag :action=> 'add_person' %>
<% controller.nbrOfNewPeople.times do | i | %>
<label for='<%='person' + i.to_s%>'>Name:</label>
<%= text_field 'person' + i.to_s, 'name' %>
</br>
<% end %>
<%= submit_tag "Add People" %>
<%= end_form_tag %>

Paul

Nasir Khan

unread,
Oct 11, 2006, 2:16:38 PM10/11/06
to rubyonra...@googlegroups.com
Starr, Paul

Thanks a lot for your responses, I was making it too complex :-( 

Just a minor refinement to Paul's example -
In the form, continue to let the text_field be associated with model person and let the field be named anything, in this case a number
...
<%= text_field 'person' , i.to_s %>
...

In the controller extract the params in a hash

my_params = params[:person]
my_params.each do |p|
        param_hash = {:name => p[1]}
        @person = Person.new(param_hash)
        .......
        @person.save
end

This allows me to have the controller not know the number of people that are sent from the form, so form can have a javascript which adds new text_fields to the form dynamically. [like gmail]

Thanks



--
I don't like $_,  actually the only place I like $s is in my wallet.
Reply all
Reply to author
Forward
0 new messages