# Editing multiple models in one form

**URL:** <https://www.ruby-forum.com/t/editing-multiple-models-in-one-form/225958>\
**Category:** Rails\
**Created:** [July 25, 2007, 11:39pm UTC](https://www.ruby-forum.com/t/editing-multiple-models-in-one-form/225958 "2007-07-25T23:39:18Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![vanderkerkoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/7feea3/32.png) [@vanderkerkoff](https://www.ruby-forum.com/u/vanderkerkoff)\
**Post date:** [July 25, 2007, 11:39pm UTC](https://www.ruby-forum.com/t/editing-multiple-models-in-one-form/225958/1 "2007-07-25T23:39:18Z")

</div>

Very new to this but would appreciate a hand as this is driving me mad,  
I’m trying to update both degree and assigned from a single form, the  
degree section updates fine but assigned just retains the same values,  
any help much appreciated!

my edit.rhtml file looks like:

# Editing degree

\<%= error\_messages\_for :degree %\>

\<%= start\_form\_tag :action =\> ‘update’, :id =\> params[:id] %\>

Title  
\<%= text\_field 'degree', 'title' %\>

Detail  
\<%= text\_area 'degree', 'detail' %\>

Careers  
\<%= text\_area 'degree', 'careers' %\>

Contact  
\<%= text\_field 'degree', 'contact' %\>

Contact  
 \<% for @assigned in @degree.assigneds %\> \<%= error\_messages\_for :assigned %\> \<% fields\_for "assigned" do |f| %\>

\<%= f.text\_field :grade %\>

 \<%@quals=Qual.find(:all)%\> 

Qualification ID  
\<%=collection\_select :assigned, :qual\_id, @quals,:id, :screen\_qual%\>  
 \<% end %\> \<% end %\>

\<%= submit\_tag “Edit” %\>  
\<%= end\_form\_tag %\>

\<%= link\_to ‘Show’, :action =\> ‘show’, :id =\> @degree %\> |  
\<%= link\_to ‘Back’, :action =\> ‘list’ %\>

and my controller file looks like:

class DegreesController \< ApplicationController

model :degree  
model :assigned  
def index  
list  
render :action =\> ‘list’  
end

# GETs should be safe (see

[URIs, Addressability, and the use of HTTP GET and POST](http://www.w3.org/2001/tag/doc/whenToUseGet.html))  
verify :method =\> :post, :only =\> [:destroy, :create, :update],  
:redirect\_to =\> { :action =\> :list }

def list  
@degree\_pages, @degrees = paginate :degrees, :per\_page =\> 10  
end

def show  
@degree = Degree.find(params[:id])  
end

def new  
@degree = Degree.new  
@assigned= Assigned.new(@params[:assigned])  
end

def create  
#@degree = Degree.new(params[:degree])  
#@assigned =Assigned.new(@params[:assigned])  
#if @degree.save  
# @degree.assigneds \<\<@assigned

```
 @degree = Degree.new(params[:degree])
 @assigned = @degree.assigneds.build(params[:assigned])
if @degree.save
   redirect_to :action => 'index'
 else
   render :action => 'new'
 end

```

end

```
 # flash[:notice] = 'Degree was successfully created.'
  #redirect_to :action => 'list'
#else
 # render :action => 'new'
#end

```

# end

def edit  
@degree = Degree.find(params[:id])  
end

def update  
@degree = Degree.find(params[:id])  
@degree.attributes = params[:degree]  
@degree.assigneds.each { |t| t.update\_attributes[:assigned] }  
if @degree.valid? && @degree.assigneds.all?(&:valid?)  
@degree.save!  
@degree.assigneds.each(&:save!)  
redirect\_to :action =\> ‘show’, :id =\> @degree  
else  
render :action =\> ‘edit’  
end  
end

def destroy  
Degree.find(params[:id]).destroy  
redirect\_to :action =\> ‘list’  
end  
end

---

<div class="post-metadata">

**Author:** ![vanderkerkoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/7feea3/32.png) [@vanderkerkoff](https://www.ruby-forum.com/u/vanderkerkoff)\
**Post date:** [July 25, 2007, 11:54pm UTC](https://www.ruby-forum.com/t/editing-multiple-models-in-one-form/225958/2 "2007-07-25T23:54:06Z")

</div>

Sorry the controller should look like this, tried something and then  
forgot to change it back

class DegreesController \< ApplicationController

model :degree  
model :assigned  
def index  
list  
render :action =\> ‘list’  
end

# GETs should be safe (see

[URIs, Addressability, and the use of HTTP GET and POST](http://www.w3.org/2001/tag/doc/whenToUseGet.html))  
verify :method =\> :post, :only =\> [:destroy, :create, :update],  
:redirect\_to =\> { :action =\> :list }

def list  
@degree\_pages, @degrees = paginate :degrees, :per\_page =\> 10  
end

def show  
@degree = Degree.find(params[:id])  
end

def new  
@degree = Degree.new  
@assigned= Assigned.new(@params[:assigned])  
end

def create  
#@degree = Degree.new(params[:degree])  
#@assigned =Assigned.new(@params[:assigned])  
#if @degree.save  
# @degree.assigneds \<\<@assigned

```
 @degree = Degree.new(params[:degree])
 @assigned = @degree.assigneds.build(params[:assigned])
if @degree.save
   redirect_to :action => 'index'
 else
   render :action => 'new'
 end

```

end

```
 # flash[:notice] = 'Degree was successfully created.'
  #redirect_to :action => 'list'
#else
 # render :action => 'new'
#end

```

# end

def edit  
@degree = Degree.find(params[:id])  
end

def update  
@degree = Degree.find(params[:id])  
@degree.attributes = params[:degree]  
@degree.assigneds.each { |t| t.attributes =  
params[:assigned][t.id.to\_s] }  
if @degree.valid? && @degree.assigneds.all?(&:valid?)  
@degree.save!  
@degree.assigneds.each(&:save!)  
redirect\_to :action =\> ‘show’, :id =\> @degree  
else  
render :action =\> ‘edit’  
end  
end

def destroy  
Degree.find(params[:id]).destroy  
redirect\_to :action =\> ‘list’  
end  
end

---

<div class="post-metadata">

**Author:** ![vanderkerkoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/7feea3/32.png) [@vanderkerkoff](https://www.ruby-forum.com/u/vanderkerkoff)\
**Post date:** [July 26, 2007, 12:34am UTC](https://www.ruby-forum.com/t/editing-multiple-models-in-one-form/225958/3 "2007-07-26T00:34:46Z")

</div>

Not to worry seem to have sorted it

---

<div class="post-metadata">

**Author:** ![vanderkerkoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/7feea3/32.png) [@vanderkerkoff](https://www.ruby-forum.com/u/vanderkerkoff)\
**Post date:** [July 26, 2007, 9:25am UTC](https://www.ruby-forum.com/t/editing-multiple-models-in-one-form/225958/4 "2007-07-26T09:25:40Z")

</div>

I would really suggest you look at form\_for and then fields\_for which  
then  
allows you to create a subset of the form specific to the second model  
that  
you want to populate.

agile web development with rails page 491.

Regards  
Ivor

---

<div class="post-metadata">

**Author:** ![vanderkerkoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/7feea3/32.png) [@vanderkerkoff](https://www.ruby-forum.com/u/vanderkerkoff)\
**Post date:** [July 26, 2007, 9:39am UTC](https://www.ruby-forum.com/t/editing-multiple-models-in-one-form/225958/5 "2007-07-26T09:39:42Z")

</div>

On Jul 26, 9:22 am, “Ivor P.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> I would really suggest you look at form\_for and then fields\_for which then  
> allows you to create a subset of the form specific to the second model that  
> you want to populate.
> 
> agile web development with rails page 491.

I had the same problem recently and came across this:

> **[Rails: Presenter Pattern](http://blog.jayfields.com/2007/03/rails-presenter-pattern.html)**
>
> The default architecture for Ruby on Rails, Model View Controller, can begin to break down as Controllers become bloated and logic begins to...

It basically wraps/aggregates several models into one. It makes your  
controller leaner, too.

Cheers  
Martin
