Hi Barney,
I believe I am having the same problem you experienced, though my code
is a little different. If you or anyone else can tell me how to solve it
that would be great!
I am creating a db of Universities and resources. One University can
have many resources, but one resource can only come from one University.
I am trying to create a form with nested attributes, so hat users wil be
encouraged to give details about the University where the resource comes
from.
Code from views/universities/_form:
<%= form_for(@university) do |f| %>
<% if @university.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@university.errors.count, "error") %> prohibited this
university from being saved:</h2>
<ul>
<% @university.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :address %><br />
<%= f.text_field :address %>
</div>
<div class="field">
<%= f.label :country %><br />
<%= f.text_field :country %>
</div>
<% f.fields_for :resources do |builder| %>
<%= render "resources/form", :f => builder %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Code from views/resources/_form:
<div class="field">
<%= f.label :subject %><br />
<%= f.text_field :subject %>
</div>
<div class="field">
<%= f.label :course %><br />
<%= f.text_field :course %>
</div>
<div class="field">
<%= f.label :alternative_use %><br />
<%= f.text_field :alternative_use %>
</div>
<div class="field">
<%= f.label :author %><br />
<%= f.text_field :author %>
</div>
<div class="field">
<%= f.label :resource_type %><br />
<%= f.text_field :resource_type %>
</div>
Code from models:
class University < ActiveRecord::Base
has_many :resources
accepts_nested_attributes_for :resources, :allow_destroy => :true,
:reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }
attr_accessible :resource_attributes
end
class Resource < ActiveRecord::Base
#Defines the relationship between resource and user.
belongs_to :user
belongs_to :university
attr_accessible :resource_type, :subject, :author, :course,
:alternative_use,
#Need to add some more validation to the fields.
def self.search(search)
if search
find(:all, :conditions => ['subject LIKE ?', "%#{search}%"])
else
find(:all)
end
end
#End class.
end
Thanks in advance,
Jen!
On 17/07/11 22:27, Barney wrote:
Hello,
An earlier post where I asked how to put mulitple tables's input
on one screen was answered with "accepts_nested_attributes_for" and
that seems to be what I need, but nothing appears on the screen for
the nested section. I've been using ideas from:
http://masonoise.wordpress.com/2010/07/23/rails-and-forms-using-accepts_nested_attributes_for/
http://railscasts.com/episodes/196-nested-model-form-part-1
http://asciicasts.com/episodes/196-nested-model-form-part-1
http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html#method-i-accepts_nested_attributes_for
The following are my classes and a little code from the
"_form.html.erb" that I'm trying to make work:
class Person< ActiveRecord::Base
default_scope :order => 'last_name'
has_many :people_skills
accepts_nested_attributes_for :people_skills, :update_only =>
true, :allow_destroy => true
end
class PeopleSkill< ActiveRecord::Base
belongs_to :person
end
Also, there is a field in the people_skills table that is person_id,
which I remember reading in the "Agile.." book creates an FK there.
<%= form_for(@person) do |f| %>
<% if @person.errors.any? %>
# ... usual code concerning errors
<% end %>
<%= f.fields_for :people_skills do |builder| %>
<%= builder.label :skill, "Skill" %><br />
<%= builder.text_field :skill %>
</p>
<p>
<%= builder.label :competency, "Competency" %><br />
<%= builder.text_field :competency %>
</p>
<% end %>
<table>
<tr>
<td>
<div class="field">
<%= f.label :first_name %><br />
<%= f.text_field :first_name %>
</div>
</td>
<td>
AND THEN MANY OTHER ROWS AND FIELDS OF THIS TABLE.
The table data for the class "Person" shows up fine, but anything with
the "f.fields_for..." is invisible (but doesn't cause a syntax
error). What DOES cause an error is to put
"@Person.people_skills.build" in the "new" method of
people_controller.rb.
So, I'm looking for a way to have one screen which creates entries in
2 tables, linked by the PK-FK. What am I doing wrong or forgetting to
do?
Thanks,
Barney
\
--
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@googlegroups.com.
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.