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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
I forgot to mention that currently each of my tables is handled by a separate controller. I thought this would be ok and anything entered in my resources _form partial would be handled by the ''resources'' controller etc. However looking at the rails cast source code has confused me a bit, as it seems that all the tables are managed by one controller. Are my nested fields not rendering because the universities table and resources have their own totally separate controllers? I will be experimenting with this more tomorrow. If someone could clarify this point about the controllers it would really help. Thanks, Jen! On 19/07/11 16:49, Jen wrote:> 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On Jul 17, 10:27 pm, Barney <bsper...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 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-accep...http://railscasts.com/episodes/196-nested-model-form-part-1http://asciicasts.com/episodes/196-nested-model-form-part-1http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/Clas... > > 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 putWhat is the error message? What''s the stack trace?> "@Person.people_skills.build" in the "new" method of > people_controller.rb.What''s the code in your controller - @Person.people... or @person.people... - is the error message due to a capitalization typo? (wouldn''t know without seeing the error msg> > 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Juan Alvarado
2011-Jul-20 14:23 UTC
Re: accepts_nested_attributes_for doesn''t show output
Sent from my iPad On Jul 19, 2011, at 6:33 PM, Jen <jen.bottom-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> I forgot to mention that currently each of my tables is handled by a separate controller. > > I thought this would be ok and anything entered in my resources _form partial would be handled by the ''resources'' controller etc. However looking at the rails cast source code has confused me a bit, as it seems that all the tables are managed by one controller. Are my nested fields not rendering because the universities table and resources have their own totally separate controllers? > > I will be experimenting with this more tomorrow. If someone could clarify this point about the controllers it would really help. > > Thanks, > Jen! > > On 19/07/11 16:49, Jen wrote: >> 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| %>You have to make sure that a resource has been built for it to show the fields, otherwise the fields_for call will not display the form fields as there is not a model Instance behind the fields. This is usually done by scoping a build through the association. For example if a university has a has_many association named resources then somewhere in the controller or view you would have to make a call similar to: @university.resources.build. This will create a new instance of the resources model to be used by fields for.>> <%= 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. > For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en. >-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On Jul 19, 11:33 pm, Jen <jen.bot...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> I forgot to mention that currently each of my tables is handled by a > separate controller.A controller is simply an entry/access point, you can pull in data from any model in any controller and pass it to any view to be used.> > I thought this would be ok and anything entered in my resources _form > partial would be handled by the ''resources'' controller etc. HoweverNo. The form ''decides'' which controller to pass _all_ the form data to, you then need to ensure that the receiving controller saves/updates the model and its relations.> looking at the rails cast source code has confused me a bit, as it seems > that all the tables are managed by one controller. Are my nested fieldsControllers don''t ''manage'' tables, they simply collect model data and pass it to a view, any required business logic should be handled by the models. You should keep the code in your controllers to a minimum, if you find that you are beginning to bloat your controller actions, or start adding loads of private methods, then you need to look at your code, and find a way to re-factor out into helpers or models or lib modules etc. For Example; class ExamplesController < ApplicationController def show @example = Example.find(params[:id]) @authors = Author.all render ''show'' end end views/examples/show.html.erb # This view can now display the example by accessing @example # It can also display a list of authors of all the examples by accessing @authors # So you can create whatever data you want in your controller, and it can be accessed in the view that is rendered.> not rendering because the universities table and resources have their > own totally separate controllers?No. You need to build any relations prior to rendering the view, you do this in your new and edit actions in your controller. Example: class Person < ActiveRecord::Base belongs_to :address accepts_nested_attributes_for :address end class Address < ActiveRecord::Base has_many :people accepts_nested_attributes_for :people end class PeopleController < ApplicationController def new @person = Person.new @person.build_address end def edit @person = Person.find(params[:id]) @person.build_address unless @person.address #don''t build an address if the person already has one end end class AddressController < ApplicationController def new @address = Address.new @address.people.build end # This is untested, I haven''t needed to set up a nested form for a model that has a has_many relation def edit @address = Address.find(params[:id]) @address.people.build unless @address.people.size > 0 #don''t build people if the address already has people end end Also, if you take a look at your Resources form, unless you have removed some of the code, it is not a form, just a list of fields for a form. If you try and use that partial on it''s own, you will not be able to. When I want to re-use form fields in other forms, I move the fields out into a separate partial and render it as you have done in your University form. The only difference, is that I create an assets folder in the relevant view folder for any additional ''out of the norm'' views/partials. Surprisingly, I call the partial _form_fields..... Then, both the University form, and the resources form can both use the same views/resources/assets/ _form_fields.html.erb partial. The fields can then be used by any other nested form. So, if you decide to add another model that utilises the resources model, you can easily create another nested form by calling in the resources _form_fields partial. HTH Paul> > I will be experimenting with this more tomorrow. If someone could > clarify this point about the controllers it would really help. > > Thanks, > Jen! > > On 19/07/11 16:49, Jen wrote: > > > > > 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-accep... > > >>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/Clas... > > >> 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Hi Paul, Thanks for the reply! Am I correct in thinking that for the data my user enters in the fields relating to resources to be inserted in to the resources table I need to render a complete form, not just a list of fields? I have tried this approach and am receiving the following error: NoMethodError in Universities#new Showing //home/resource_portal/website/app/views/resources/_form.html.erb/ where line *#1* raised: |undefined method `model_name'' for NilClass:Class| Extracted source (around line *#1*): |1:<%= form_for(@resource) do |f| %> 2:<% if @resource.errors.any? %> 3:<div id="error_explanation"> 4:<h2><%= pluralize(@resource.errors.count, "error") %> prohibited this resource from being saved:</h2> | Trace of template inclusion: app/views/universities/_form.html.erb, app/views/universities/new.html.erb || Any further assistance with this would be great. Thanks in advance, Jen! On 20/07/11 15:54, paul h wrote:> > On Jul 19, 11:33 pm, Jen<jen.bot...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >> I forgot to mention that currently each of my tables is handled by a >> separate controller. > A controller is simply an entry/access point, you can pull in data > from any model in any controller and pass it to any view to be used. > >> I thought this would be ok and anything entered in my resources _form >> partial would be handled by the ''resources'' controller etc. However > No. > > The form ''decides'' which controller to pass _all_ the form data to, > you then need to ensure that the receiving controller saves/updates > the model and its relations. > >> looking at the rails cast source code has confused me a bit, as it seems >> that all the tables are managed by one controller. Are my nested fields > Controllers don''t ''manage'' tables, they simply collect model data and > pass it to a view, any required business logic should be handled by > the models. You should keep the code in your controllers to a minimum, > if you find that you are beginning to bloat your controller actions, > or start adding loads of private methods, then you need to look at > your code, and find a way to re-factor out into helpers or models or > lib modules etc. > > For Example; > > class ExamplesController< ApplicationController > def show > @example = Example.find(params[:id]) > @authors = Author.all > render ''show'' > end > end > > views/examples/show.html.erb > # This view can now display the example by accessing @example > # It can also display a list of authors of all the examples by > accessing @authors > # So you can create whatever data you want in your controller, and it > can be accessed in the view that is rendered. > > >> not rendering because the universities table and resources have their >> own totally separate controllers? > No. > > You need to build any relations prior to rendering the view, you do > this in your new and edit actions in your controller. > > Example: > > class Person< ActiveRecord::Base > belongs_to :address > accepts_nested_attributes_for :address > end > > class Address< ActiveRecord::Base > has_many :people > accepts_nested_attributes_for :people > end > > class PeopleController< ApplicationController > def new > @person = Person.new > @person.build_address > end > > def edit > @person = Person.find(params[:id]) > @person.build_address unless @person.address #don''t build an > address if the person already has one > end > end > > class AddressController< ApplicationController > def new > @address = Address.new > @address.people.build > end > > # This is untested, I haven''t needed to set up a nested form for a > model that has a has_many relation > def edit > @address = Address.find(params[:id]) > @address.people.build unless @address.people.size> 0 #don''t build > people if the address already has people > end > end > > Also, if you take a look at your Resources form, unless you have > removed some of the code, it is not a form, just a list of fields for > a form. If you try and use that partial on it''s own, you will not be > able to. > > When I want to re-use form fields in other forms, I move the fields > out into a separate partial and render it as you have done in your > University form. The only difference, is that I create an assets > folder in the relevant view folder for any additional ''out of the > norm'' views/partials. Surprisingly, I call the partial > _form_fields..... Then, both the University form, and the resources > form can both use the same views/resources/assets/ > _form_fields.html.erb partial. > > The fields can then be used by any other nested form. So, if you > decide to add another model that utilises the resources model, you can > easily create another nested form by calling in the resources > _form_fields partial. > > HTH > > Paul >> I will be experimenting with this more tomorrow. If someone could >> clarify this point about the controllers it would really help. >> >> Thanks, >> Jen! >> >> On 19/07/11 16:49, Jen wrote: >> >> >> >>> 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-accep... >>>> 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/Clas... >>>> 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Colin Law
2011-Jul-21 08:43 UTC
Re: Re: accepts_nested_attributes_for doesn''t show output
On 21 July 2011 09:29, Jen <jen.bottom-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hi Paul, > Thanks for the reply! > > Am I correct in thinking that for the data my user enters in the fields > relating to resources to be inserted in to the resources table I need to > render a complete form, not just a list of fields? > > I have tried this approach and am receiving the following error: > > NoMethodError in Universities#new > > Showing /home/resource_portal/website/app/views/resources/_form.html.erb > where line #1 raised: > > undefined method `model_name'' for NilClass:Class > > Extracted source (around line #1): > > 1: <%= form_for(@resource) do |f| %>The error simply means that @resource is nil. If you set this in the controller using find then maybe the find did not find a matching record. Colin -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Hi Colin, I can''t see anything in my controller that indicates I have set @resource to nil. When I go directly to the resources form it renders fine and I can add data about new resources. It''s just when trying to render the form as a partial within the universities/_form view. Do I need to add something in the ''universities_controller'' that gives @resource a value. Perhaps ''@resource = Resource.new''? Below is the code from the ''universities_controller'' so far: class UniversitiesController < ApplicationController #insure users are signed in before viewing these pages before_filter :authenticate # GET /universities # GET /universities.xml def index @universities = University.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @universities } end end # GET /universities/1 # GET /universities/1.xml def show @university = University.find(params[:id]) respond_to do |format| format.html # show.html.erb format.xml { render :xml => @university } end end # GET /universities/new # GET /universities/new.xml def new @university = University.new respond_to do |format| format.html # new.html.erb format.xml { render :xml => @university } resource = @university.resources.build end end # GET /universities/1/edit def edit @university = University.find(params[:id]) end # POST /universities # POST /universities.xml def create @university = University.new(params[:university]) respond_to do |format| if @university.save format.html { redirect_to(@university, :notice => ''University was successfully created.'') } format.xml { render :xml => @university, :status => :created, :location => @university } else format.html { render :action => "new" } format.xml { render :xml => @university.errors, :status => :unprocessable_entity } end end end # PUT /universities/1 # PUT /universities/1.xml def update @university = University.find(params[:id]) respond_to do |format| if @university.update_attributes(params[:university]) format.html { redirect_to(@university, :notice => ''University was successfully updated.'') } format.xml { head :ok } else format.html { render :action => "edit" } format.xml { render :xml => @university.errors, :status => :unprocessable_entity } end end end # DELETE /universities/1 # DELETE /universities/1.xml def destroy @university = University.find(params[:id]) @university.destroy respond_to do |format| format.html { redirect_to(universities_url) } format.xml { head :ok } end end end Thanks, Jen. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Colin Law
2011-Jul-21 11:11 UTC
Re: Re: accepts_nested_attributes_for doesn''t show output
On 21 July 2011 11:55, Jen <jen.bottom-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: Please don''t top post, it makes it difficult to follow the thread. Insert your reply at appropriate point(s) in previous post. Thanks.> Hi Colin, > I can''t see anything in my controller that indicates I have set @resource to > nil. > When I go directly to the resources form it renders fine and I can add data > about new resources. It''s just when trying to render the form as a partial > within the universities/_form view.I had missed the fact that you were in a partial. Have a look at the Rails Guide on Layouts and Rendering, specifically the section on using partials and passing values to it. If you have not already done so, also have a good look the other guides, it will be time well spent. Colin> > Do I need to add something in the ''universities_controller'' that gives > @resource a value. Perhaps ''@resource = Resource.new''? > > Below is the code from the ''universities_controller'' so far: > > class UniversitiesController < ApplicationController > #insure users are signed in before viewing these pages > before_filter :authenticate > > # GET /universities > # GET /universities.xml > def index > @universities = University.all > > respond_to do |format| > format.html # index.html.erb > format.xml { render :xml => @universities } > end > end > > # GET /universities/1 > # GET /universities/1.xml > def show > @university = University.find(params[:id]) > > respond_to do |format| > format.html # show.html.erb > format.xml { render :xml => @university } > end > end > > # GET /universities/new > # GET /universities/new.xml > def new > @university = University.new > > respond_to do |format| > format.html # new.html.erb > format.xml { render :xml => @university } > resource = @university.resources.build > > end > end > > # GET /universities/1/edit > def edit > @university = University.find(params[:id]) > end > > # POST /universities > # POST /universities.xml > def create > @university = University.new(params[:university]) > > respond_to do |format| > if @university.save > format.html { redirect_to(@university, :notice => ''University was > successfully created.'') } > format.xml { render :xml => @university, :status => :created, > :location => @university } > else > format.html { render :action => "new" } > format.xml { render :xml => @university.errors, :status => > :unprocessable_entity } > end > end > end > > # PUT /universities/1 > # PUT /universities/1.xml > def update > @university = University.find(params[:id]) > > respond_to do |format| > if @university.update_attributes(params[:university]) > format.html { redirect_to(@university, :notice => ''University was > successfully updated.'') } > format.xml { head :ok } > else > format.html { render :action => "edit" } > format.xml { render :xml => @university.errors, :status => > :unprocessable_entity } > end > end > end > > # DELETE /universities/1 > # DELETE /universities/1.xml > def destroy > @university = University.find(params[:id]) > -E0jTjEqft5ObEF0i2MPMWwS+D6j9UgRo@public.gmane.org > > respond_to do |format| > format.html { redirect_to(universities_url) } > format.xml { head :ok } > end > end > end > > Thanks, > Jen. > > -- > 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to > rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > For more options, visit this group at > http://groups.google.com/group/rubyonrails-talk?hl=en. > >-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Hi, After getting nowhere I decided to follow this article: http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes This meant replicating some already existing fields in my universities/_form, but I felt it would atleast rule out the possibility I was doing something silly with partials. Now I am receiving the following error: NoMethodError in Universities#new Showing /home/resource_portal/website/app/views/universities/_form.html.erb where line #26 raised: undefined method `fields_for'' for nil:NilClass Extracted source (around line #26): 23: <%= f.label :country %><br /> 24: <%= f.text_field :country %> 25: </div> 26: <%= form.fields_for :resources do |resource| %> 27: <%= f.label :resource_type %><br /> 28: <%= f.text_field :resource_type %> 29: </div> Trace of template inclusion: app/views/universities/new.html.erb Rails.root: /home/resource_portal/website Application Trace | Framework Trace | Full Trace rake-0.8.7/ruby/1.9.1/gems/activesupport-3.0.3/lib/active_support/whiny_nil.rb:48:in `method_missing'' My code for the models, universities controller and view is attached. Can someone please point out what I am doing wrong? I have read many articles, posts and have tried many variations to achieve this. Do I need to set @resources and @universities to equal some value before rendering the form? Code for controller: class UniversitiesController < ApplicationController #insure users are signed in before viewing these pages before_filter :authenticate # GET /universities # GET /universities.xml def index @universities = University.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @universities } end end # GET /universities/1 # GET /universities/1.xml def show @university = University.find(params[:id]) respond_to do |format| format.html # show.html.erb format.xml { render :xml => @university } end end # GET /universities/new # GET /universities/new.xml def new @university = University.new @resource = @university.resources.build respond_to do |format| format.html # new.html.erb format.xml { render :xml => @university } end end # GET /universities/1/edit def edit @university = University.find(params[:id]) end # POST /universities # POST /universities.xml def create @university = University.new(params[:university]) respond_to do |format| if @university.save format.html { redirect_to(@university, :notice => ''University was successfully created.'') } format.xml { render :xml => @university, :status => :created, :location => @university } else format.html { render :action => "new" } format.xml { render :xml => @university.errors, :status => :unprocessable_entity } end end end # PUT /universities/1 # PUT /universities/1.xml def update @university = University.find(params[:id]) respond_to do |format| if @university.update_attributes(params[:university]) format.html { redirect_to(@university, :notice => ''University was successfully updated.'') } format.xml { head :ok } else format.html { render :action => "edit" } format.xml { render :xml => @university.errors, :status => :unprocessable_entity } end end end # DELETE /universities/1 # DELETE /universities/1.xml def destroy @university = University.find(params[:id]) @university.destroy respond_to do |format| format.html { redirect_to(universities_url) } format.xml { head :ok } end end end Code for 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}%"]) #Join tables here else find(:all) end end #End class. end Code for views: <%= 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> <%= form.fields_for :resources do |resource| %> <%= f.label :resource_type %><br /> <%= f.text_field :resource_type %> </div> <% end %> <div class="actions"> <%= f.submit %> </div> <% end %> <h1>New university</h1> <%= render ''form'' %> <ul> <li> <%= link_to ''Back'', universities_path %> </li> </ul> Thanks in advance for any further assistance, Jen. On 21/07/11 12:11, Colin Law wrote:> On 21 July 2011 11:55, Jen<jen.bottom-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > Please don''t top post, it makes it difficult to follow the thread. > Insert your reply at appropriate point(s) in previous post. Thanks. > >> Hi Colin, >> I can''t see anything in my controller that indicates I have set @resource to >> nil. >> When I go directly to the resources form it renders fine and I can add data >> about new resources. It''s just when trying to render the form as a partial >> within the universities/_form view. > I had missed the fact that you were in a partial. Have a look at the > Rails Guide on Layouts and Rendering, specifically the section on > using partials and passing values to it. > > If you have not already done so, also have a good look the other > guides, it will be time well spent. > > > Colin > >> Do I need to add something in the ''universities_controller'' that gives >> @resource a value. Perhaps ''@resource = Resource.new''? >> >> Below is the code from the ''universities_controller'' so far: >> >> class UniversitiesController< ApplicationController >> #insure users are signed in before viewing these pages >> before_filter :authenticate >> >> # GET /universities >> # GET /universities.xml >> def index >> @universities = University.all >> >> respond_to do |format| >> format.html # index.html.erb >> format.xml { render :xml => @universities } >> end >> end >> >> # GET /universities/1 >> # GET /universities/1.xml >> def show >> @university = University.find(params[:id]) >> >> respond_to do |format| >> format.html # show.html.erb >> format.xml { render :xml => @university } >> end >> end >> >> # GET /universities/new >> # GET /universities/new.xml >> def new >> @university = University.new >> >> respond_to do |format| >> format.html # new.html.erb >> format.xml { render :xml => @university } >> resource = @university.resources.build >> >> end >> end >> >> # GET /universities/1/edit >> def edit >> @university = University.find(params[:id]) >> end >> >> # POST /universities >> # POST /universities.xml >> def create >> @university = University.new(params[:university]) >> >> respond_to do |format| >> if @university.save >> format.html { redirect_to(@university, :notice => ''University was >> successfully created.'') } >> format.xml { render :xml => @university, :status => :created, >> :location => @university } >> else >> format.html { render :action => "new" } >> format.xml { render :xml => @university.errors, :status => >> :unprocessable_entity } >> end >> end >> end >> >> # PUT /universities/1 >> # PUT /universities/1.xml >> def update >> @university = University.find(params[:id]) >> >> respond_to do |format| >> if @university.update_attributes(params[:university]) >> format.html { redirect_to(@university, :notice => ''University was >> successfully updated.'') } >> format.xml { head :ok } >> else >> format.html { render :action => "edit" } >> format.xml { render :xml => @university.errors, :status => >> :unprocessable_entity } >> end >> end >> end >> >> # DELETE /universities/1 >> # DELETE /universities/1.xml >> def destroy >> @university = University.find(params[:id]) >> @university.destroy >> >> respond_to do |format| >> format.html { redirect_to(universities_url) } >> format.xml { head :ok } >> end >> end >> end >> >> Thanks, >> Jen. >> >> -- >> 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org >> To unsubscribe from this group, send email to >> rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org >> For more options, visit this group at >> http://groups.google.com/group/rubyonrails-talk?hl=en. >> >>-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Tom Meinlschmidt
2011-Jul-21 14:53 UTC
Re: accepts_nested_attributes_for doesn''t show output
guy, you''re using f.label, so then you have to use f.fields_for :something do |smth| smth.label :label, "description" smth.text_field ... On Jul 21, 2011, at 16:49 , Jen wrote:> Hi, > After getting nowhere I decided to follow this article: > > http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes > > This meant replicating some already existing fields in my universities/_form, but I felt it would atleast rule out the possibility I was doing something silly with partials. Now I am receiving the following error: > > NoMethodError in Universities#new > > Showing /home/resource_portal/website/app/views/universities/_form.html.erb where line #26 raised: > > undefined method `fields_for'' for nil:NilClass > > Extracted source (around line #26): > > 23: <%= f.label :country %><br /> > 24: <%= f.text_field :country %> > 25: </div> > 26: <%= form.fields_for :resources do |resource| %> > 27: <%= f.label :resource_type %><br /> > 28: <%= f.text_field :resource_type %> > 29: </div> > > Trace of template inclusion: app/views/universities/new.html.erb > > Rails.root: /home/resource_portal/website > Application Trace | Framework Trace | Full Trace > > rake-0.8.7/ruby/1.9.1/gems/activesupport-3.0.3/lib/active_support/whiny_nil.rb:48:in `method_missing'' > > My code for the models, universities controller and view is attached. Can someone please point out what I am doing wrong? I have read many articles, posts and have tried many variations to achieve this. Do I need to set @resources and @universities to equal some value before rendering the form? > > Code for controller: > > class UniversitiesController < ApplicationController > #insure users are signed in before viewing these pages > before_filter :authenticate > > # GET /universities > # GET /universities.xml > def index > @universities = University.all > > respond_to do |format| > format.html # index.html.erb > format.xml { render :xml => @universities } > end > end > > # GET /universities/1 > # GET /universities/1.xml > def show > @university = University.find(params[:id]) > > respond_to do |format| > format.html # show.html.erb > format.xml { render :xml => @university } > end > end > > # GET /universities/new > # GET /universities/new.xml > def new > @university = University.new > @resource = @university.resources.build > respond_to do |format| > format.html # new.html.erb > format.xml { render :xml => @university } > > end > end > > # GET /universities/1/edit > def edit > @university = University.find(params[:id]) > end > > # POST /universities > # POST /universities.xml > def create > @university = University.new(params[:university]) > > respond_to do |format| > if @university.save > format.html { redirect_to(@university, :notice => ''University was successfully created.'') } > format.xml { render :xml => @university, :status => :created, :location => @university } > else > format.html { render :action => "new" } > format.xml { render :xml => @university.errors, :status => :unprocessable_entity } > end > end > end > > # PUT /universities/1 > # PUT /universities/1.xml > def update > @university = University.find(params[:id]) > > respond_to do |format| > if @university.update_attributes(params[:university]) > format.html { redirect_to(@university, :notice => ''University was successfully updated.'') } > format.xml { head :ok } > else > format.html { render :action => "edit" } > format.xml { render :xml => @university.errors, :status => :unprocessable_entity } > end > end > end > > # DELETE /universities/1 > # DELETE /universities/1.xml > def destroy > @university = University.find(params[:id]) > @university.destroy > > respond_to do |format| > format.html { redirect_to(universities_url) } > format.xml { head :ok } > end > end > end > > Code for 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}%"]) > #Join tables here > > else > find(:all) > end > end > #End class. > end > > Code for views: > > <%= 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> > <%= form.fields_for :resources do |resource| %> > <%= f.label :resource_type %><br /> > <%= f.text_field :resource_type %> > </div> > <% end %> > <div class="actions"> > <%= f.submit %> > </div> > <% end %> > > <h1>New university</h1> > > <%= render ''form'' %> > <ul> > <li> <%= link_to ''Back'', universities_path %> </li> > </ul> > > Thanks in advance for any further assistance, > Jen. > On 21/07/11 12:11, Colin Law wrote: >> On 21 July 2011 11:55, Jen<jen.bottom-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >> >> Please don''t top post, it makes it difficult to follow the thread. >> Insert your reply at appropriate point(s) in previous post. Thanks. >> >>> Hi Colin, >>> I can''t see anything in my controller that indicates I have set @resource to >>> nil. >>> When I go directly to the resources form it renders fine and I can add data >>> about new resources. It''s just when trying to render the form as a partial >>> within the universities/_form view. >> I had missed the fact that you were in a partial. Have a look at the >> Rails Guide on Layouts and Rendering, specifically the section on >> using partials and passing values to it. >> >> If you have not already done so, also have a good look the other >> guides, it will be time well spent. >> >> >> Colin >> >>> Do I need to add something in the ''universities_controller'' that gives >>> @resource a value. Perhaps ''@resource = Resource.new''? >>> >>> Below is the code from the ''universities_controller'' so far: >>> >>> class UniversitiesController< ApplicationController >>> #insure users are signed in before viewing these pages >>> before_filter :authenticate >>> >>> # GET /universities >>> # GET /universities.xml >>> def index >>> @universities = University.all >>> >>> respond_to do |format| >>> format.html # index.html.erb >>> format.xml { render :xml => @universities } >>> end >>> end >>> >>> # GET /universities/1 >>> # GET /universities/1.xml >>> def show >>> @university = University.find(params[:id]) >>> >>> respond_to do |format| >>> format.html # show.html.erb >>> format.xml { render :xml => @university } >>> end >>> end >>> >>> # GET /universities/new >>> # GET /universities/new.xml >>> def new >>> @university = University.new >>> >>> respond_to do |format| >>> format.html # new.html.erb >>> format.xml { render :xml => @university } >>> resource = @university.resources.build >>> >>> end >>> end >>> >>> # GET /universities/1/edit >>> def edit >>> @university = University.find(params[:id]) >>> end >>> >>> # POST /universities >>> # POST /universities.xml >>> def create >>> @university = University.new(params[:university]) >>> >>> respond_to do |format| >>> if @university.save >>> format.html { redirect_to(@university, :notice => ''University was >>> successfully created.'') } >>> format.xml { render :xml => @university, :status => :created, >>> :location => @university } >>> else >>> format.html { render :action => "new" } >>> format.xml { render :xml => @university.errors, :status => >>> :unprocessable_entity } >>> end >>> end >>> end >>> >>> # PUT /universities/1 >>> # PUT /universities/1.xml >>> def update >>> @university = University.find(params[:id]) >>> >>> respond_to do |format| >>> if @university.update_attributes(params[:university]) >>> format.html { redirect_to(@university, :notice => ''University was >>> successfully updated.'') } >>> format.xml { head :ok } >>> else >>> format.html { render :action => "edit" } >>> format.xml { render :xml => @university.errors, :status => >>> :unprocessable_entity } >>> end >>> end >>> end >>> >>> # DELETE /universities/1 >>> # DELETE /universities/1.xml >>> def destroy >>> @university = University.find(params[:id]) >>> @university.destroy >>> >>> respond_to do |format| >>> format.html { redirect_to(universities_url) } >>> format.xml { head :ok } >>> end >>> end >>> end >>> >>> Thanks, >>> Jen. >>> >>> -- >>> 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org >>> To unsubscribe from this group, send email to >>> rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org >>> For more options, visit this group at >>> http://groups.google.com/group/rubyonrails-talk?hl=en. >>> >>> > > -- > 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. > For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.-- ==============================================================================Tomas Meinlschmidt, MS {MCT, MCP+I, MCSE, AER}, NetApp Filer/NetCache www.meinlschmidt.com www.maxwellrender.cz www.lightgems.cz ============================================================================== -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Juan Alvarado
2011-Jul-21 14:54 UTC
Re: Re: accepts_nested_attributes_for doesn''t show output
On Jul 21, 2011, at 10:49 AM, Jen wrote:> Hi, > After getting nowhere I decided to follow this article: > > http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes > > This meant replicating some already existing fields in my universities/_form, but I felt it would atleast rule out the possibility I was doing something silly with partials. Now I am receiving the following error: > > NoMethodError in Universities#new > > Showing /home/resource_portal/website/app/views/universities/_form.html.erb where line #26 raised: > > undefined method `fields_for'' for nil:NilClass > > Extracted source (around line #26): > > 23: <%= f.label :country %><br /> > 24: <%= f.text_field :country %> > 25: </div> > 26: <%= form.fields_for :resources do |resource| %>You have form.fields_for here while all your other form fields refer to f and your form_for defines |f|. Change this line to f.fields_for and that should fix your nil error> 27: <%= f.label :resource_type %><br /> > 28: <%= f.text_field :resource_type %> > 29: </div> > > Trace of template inclusion: app/views/universities/new.html.erb > > Rails.root: /home/resource_portal/website > Application Trace | Framework Trace | Full Trace > > rake-0.8.7/ruby/1.9.1/gems/activesupport-3.0.3/lib/active_support/whiny_nil.rb:48:in `method_missing'' > > My code for the models, universities controller and view is attached. Can someone please point out what I am doing wrong? I have read many articles, posts and have tried many variations to achieve this. Do I need to set @resources and @universities to equal some value before rendering the form? > > Code for controller: > > class UniversitiesController < ApplicationController > #insure users are signed in before viewing these pages > before_filter :authenticate > > # GET /universities > # GET /universities.xml > def index > @universities = University.all > > respond_to do |format| > format.html # index.html.erb > format.xml { render :xml => @universities } > end > end > > # GET /universities/1 > # GET /universities/1.xml > def show > @university = University.find(params[:id]) > > respond_to do |format| > format.html # show.html.erb > format.xml { render :xml => @university } > end > end > > # GET /universities/new > # GET /universities/new.xml > def new > @university = University.new > @resource = @university.resources.build > respond_to do |format| > format.html # new.html.erb > format.xml { render :xml => @university } > > end > end > > # GET /universities/1/edit > def edit > @university = University.find(params[:id]) > end > > # POST /universities > # POST /universities.xml > def create > @university = University.new(params[:university]) > > respond_to do |format| > if @university.save > format.html { redirect_to(@university, :notice => ''University was successfully created.'') } > format.xml { render :xml => @university, :status => :created, :location => @university } > else > format.html { render :action => "new" } > format.xml { render :xml => @university.errors, :status => :unprocessable_entity } > end > end > end > > # PUT /universities/1 > # PUT /universities/1.xml > def update > @university = University.find(params[:id]) > > respond_to do |format| > if @university.update_attributes(params[:university]) > format.html { redirect_to(@university, :notice => ''University was successfully updated.'') } > format.xml { head :ok } > else > format.html { render :action => "edit" } > format.xml { render :xml => @university.errors, :status => :unprocessable_entity } > end > end > end > > # DELETE /universities/1 > # DELETE /universities/1.xml > def destroy > @university = University.find(params[:id]) > @university.destroy > > respond_to do |format| > format.html { redirect_to(universities_url) } > format.xml { head :ok } > end > end > end > > Code for 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}%"]) > #Join tables here > > else > find(:all) > end > end > #End class. > end > > Code for views: > > <%= 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> > <%= form.fields_for :resources do |resource| %> > <%= f.label :resource_type %><br /> > <%= f.text_field :resource_type %> > </div> > <% end %> > <div class="actions"> > <%= f.submit %> > </div> > <% end %> > > <h1>New university</h1> > > <%= render ''form'' %> > <ul> > <li> <%= link_to ''Back'', universities_path %> </li> > </ul> > > Thanks in advance for any further assistance, > Jen. > On 21/07/11 12:11, Colin Law wrote: >> On 21 July 2011 11:55, Jen<jen.bottom-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >> >> Please don''t top post, it makes it difficult to follow the thread. >> Insert your reply at appropriate point(s) in previous post. Thanks. >> >>> Hi Colin, >>> I can''t see anything in my controller that indicates I have set @resource to >>> nil. >>> When I go directly to the resources form it renders fine and I can add data >>> about new resources. It''s just when trying to render the form as a partial >>> within the universities/_form view. >> I had missed the fact that you were in a partial. Have a look at the >> Rails Guide on Layouts and Rendering, specifically the section on >> using partials and passing values to it. >> >> If you have not already done so, also have a good look the other >> guides, it will be time well spent. >> >> >> Colin >> >>> Do I need to add something in the ''universities_controller'' that gives >>> @resource a value. Perhaps ''@resource = Resource.new''? >>> >>> Below is the code from the ''universities_controller'' so far: >>> >>> class UniversitiesController< ApplicationController >>> #insure users are signed in before viewing these pages >>> before_filter :authenticate >>> >>> # GET /universities >>> # GET /universities.xml >>> def index >>> @universities = University.all >>> >>> respond_to do |format| >>> format.html # index.html.erb >>> format.xml { render :xml => @universities } >>> end >>> end >>> >>> # GET /universities/1 >>> # GET /universities/1.xml >>> def show >>> @university = University.find(params[:id]) >>> >>> respond_to do |format| >>> format.html # show.html.erb >>> format.xml { render :xml => @university } >>> end >>> end >>> >>> # GET /universities/new >>> # GET /universities/new.xml >>> def new >>> @university = University.new >>> >>> respond_to do |format| >>> format.html # new.html.erb >>> format.xml { render :xml => @university } >>> resource = @university.resources.build >>> >>> end >>> end >>> >>> # GET /universities/1/edit >>> def edit >>> @university = University.find(params[:id]) >>> end >>> >>> # POST /universities >>> # POST /universities.xml >>> def create >>> @university = University.new(params[:university]) >>> >>> respond_to do |format| >>> if @university.save >>> format.html { redirect_to(@university, :notice => ''University was >>> successfully created.'') } >>> format.xml { render :xml => @university, :status => :created, >>> :location => @university } >>> else >>> format.html { render :action => "new" } >>> format.xml { render :xml => @university.errors, :status => >>> :unprocessable_entity } >>> end >>> end >>> end >>> >>> # PUT /universities/1 >>> # PUT /universities/1.xml >>> def update >>> @university = University.find(params[:id]) >>> >>> respond_to do |format| >>> if @university.update_attributes(params[:university]) >>> format.html { redirect_to(@university, :notice => ''University was >>> successfully updated.'') } >>> format.xml { head :ok } >>> else >>> format.html { render :action => "edit" } >>> format.xml { render :xml => @university.errors, :status => >>> :unprocessable_entity } >>> end >>> end >>> end >>> >>> # DELETE /universities/1 >>> # DELETE /universities/1.xml >>> def destroy >>> @university = University.find(params[:id]) >>> @university.destroy >>> >>> respond_to do |format| >>> format.html { redirect_to(universities_url) } >>> format.xml { head :ok } >>> end >>> end >>> end >>> >>> Thanks, >>> Jen. >>> >>> -- >>> 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org >>> To unsubscribe from this group, send email to >>> rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org >>> For more options, visit this group at >>> http://groups.google.com/group/rubyonrails-talk?hl=en. >>> >>> > > -- > 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. > For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en. >-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Hi, list. Thanks for the help, nested forms working now. Cheers, Jen! On 21/07/11 15:54, Juan Alvarado wrote:> On Jul 21, 2011, at 10:49 AM, Jen wrote: > >> Hi, >> After getting nowhere I decided to follow this article: >> >> http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes >> >> This meant replicating some already existing fields in my universities/_form, but I felt it would atleast rule out the possibility I was doing something silly with partials. Now I am receiving the following error: >> >> NoMethodError in Universities#new >> >> Showing /home/resource_portal/website/app/views/universities/_form.html.erb where line #26 raised: >> >> undefined method `fields_for'' for nil:NilClass >> >> Extracted source (around line #26): >> >> 23:<%= f.label :country %><br /> >> 24:<%= f.text_field :country %> >> 25:</div> >> 26:<%= form.fields_for :resources do |resource| %> > You have form.fields_for here while all your other form fields refer to f and your form_for defines |f|. Change this line to f.fields_for and that should fix your nil error > >> 27:<%= f.label :resource_type %><br /> >> 28:<%= f.text_field :resource_type %> >> 29:</div> >> >> Trace of template inclusion: app/views/universities/new.html.erb >> >> Rails.root: /home/resource_portal/website >> Application Trace | Framework Trace | Full Trace >> >> rake-0.8.7/ruby/1.9.1/gems/activesupport-3.0.3/lib/active_support/whiny_nil.rb:48:in `method_missing'' >> >> My code for the models, universities controller and view is attached. Can someone please point out what I am doing wrong? I have read many articles, posts and have tried many variations to achieve this. Do I need to set @resources and @universities to equal some value before rendering the form? >> >> Code for controller: >> >> class UniversitiesController< ApplicationController >> #insure users are signed in before viewing these pages >> before_filter :authenticate >> >> # GET /universities >> # GET /universities.xml >> def index >> @universities = University.all >> >> respond_to do |format| >> format.html # index.html.erb >> format.xml { render :xml => @universities } >> end >> end >> >> # GET /universities/1 >> # GET /universities/1.xml >> def show >> @university = University.find(params[:id]) >> >> respond_to do |format| >> format.html # show.html.erb >> format.xml { render :xml => @university } >> end >> end >> >> # GET /universities/new >> # GET /universities/new.xml >> def new >> @university = University.new >> @resource = @university.resources.build >> respond_to do |format| >> format.html # new.html.erb >> format.xml { render :xml => @university } >> >> end >> end >> >> # GET /universities/1/edit >> def edit >> @university = University.find(params[:id]) >> end >> >> # POST /universities >> # POST /universities.xml >> def create >> @university = University.new(params[:university]) >> >> respond_to do |format| >> if @university.save >> format.html { redirect_to(@university, :notice => ''University was successfully created.'') } >> format.xml { render :xml => @university, :status => :created, :location => @university } >> else >> format.html { render :action => "new" } >> format.xml { render :xml => @university.errors, :status => :unprocessable_entity } >> end >> end >> end >> >> # PUT /universities/1 >> # PUT /universities/1.xml >> def update >> @university = University.find(params[:id]) >> >> respond_to do |format| >> if @university.update_attributes(params[:university]) >> format.html { redirect_to(@university, :notice => ''University was successfully updated.'') } >> format.xml { head :ok } >> else >> format.html { render :action => "edit" } >> format.xml { render :xml => @university.errors, :status => :unprocessable_entity } >> end >> end >> end >> >> # DELETE /universities/1 >> # DELETE /universities/1.xml >> def destroy >> @university = University.find(params[:id]) >> @university.destroy >> >> respond_to do |format| >> format.html { redirect_to(universities_url) } >> format.xml { head :ok } >> end >> end >> end >> >> Code for 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}%"]) >> #Join tables here >> >> else >> find(:all) >> end >> end >> #End class. >> end >> >> Code for views: >> >> <%= 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> >> <%= form.fields_for :resources do |resource| %> >> <%= f.label :resource_type %><br /> >> <%= f.text_field :resource_type %> >> </div> >> <% end %> >> <div class="actions"> >> <%= f.submit %> >> </div> >> <% end %> >> >> <h1>New university</h1> >> >> <%= render ''form'' %> >> <ul> >> <li> <%= link_to ''Back'', universities_path %> </li> >> </ul> >> >> Thanks in advance for any further assistance, >> Jen. >> On 21/07/11 12:11, Colin Law wrote: >>> On 21 July 2011 11:55, Jen<jen.bottom-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >>> >>> Please don''t top post, it makes it difficult to follow the thread. >>> Insert your reply at appropriate point(s) in previous post. Thanks. >>> >>>> Hi Colin, >>>> I can''t see anything in my controller that indicates I have set @resource to >>>> nil. >>>> When I go directly to the resources form it renders fine and I can add data >>>> about new resources. It''s just when trying to render the form as a partial >>>> within the universities/_form view. >>> I had missed the fact that you were in a partial. Have a look at the >>> Rails Guide on Layouts and Rendering, specifically the section on >>> using partials and passing values to it. >>> >>> If you have not already done so, also have a good look the other >>> guides, it will be time well spent. >>> >>> >>> Colin >>> >>>> Do I need to add something in the ''universities_controller'' that gives >>>> @resource a value. Perhaps ''@resource = Resource.new''? >>>> >>>> Below is the code from the ''universities_controller'' so far: >>>> >>>> class UniversitiesController< ApplicationController >>>> #insure users are signed in before viewing these pages >>>> before_filter :authenticate >>>> >>>> # GET /universities >>>> # GET /universities.xml >>>> def index >>>> @universities = University.all >>>> >>>> respond_to do |format| >>>> format.html # index.html.erb >>>> format.xml { render :xml => @universities } >>>> end >>>> end >>>> >>>> # GET /universities/1 >>>> # GET /universities/1.xml >>>> def show >>>> @university = University.find(params[:id]) >>>> >>>> respond_to do |format| >>>> format.html # show.html.erb >>>> format.xml { render :xml => @university } >>>> end >>>> end >>>> >>>> # GET /universities/new >>>> # GET /universities/new.xml >>>> def new >>>> @university = University.new >>>> >>>> respond_to do |format| >>>> format.html # new.html.erb >>>> format.xml { render :xml => @university } >>>> resource = @university.resources.build >>>> >>>> end >>>> end >>>> >>>> # GET /universities/1/edit >>>> def edit >>>> @university = University.find(params[:id]) >>>> end >>>> >>>> # POST /universities >>>> # POST /universities.xml >>>> def create >>>> @university = University.new(params[:university]) >>>> >>>> respond_to do |format| >>>> if @university.save >>>> format.html { redirect_to(@university, :notice => ''University was >>>> successfully created.'') } >>>> format.xml { render :xml => @university, :status => :created, >>>> :location => @university } >>>> else >>>> format.html { render :action => "new" } >>>> format.xml { render :xml => @university.errors, :status => >>>> :unprocessable_entity } >>>> end >>>> end >>>> end >>>> >>>> # PUT /universities/1 >>>> # PUT /universities/1.xml >>>> def update >>>> @university = University.find(params[:id]) >>>> >>>> respond_to do |format| >>>> if @university.update_attributes(params[:university]) >>>> format.html { redirect_to(@university, :notice => ''University was >>>> successfully updated.'') } >>>> format.xml { head :ok } >>>> else >>>> format.html { render :action => "edit" } >>>> format.xml { render :xml => @university.errors, :status => >>>> :unprocessable_entity } >>>> end >>>> end >>>> end >>>> >>>> # DELETE /universities/1 >>>> # DELETE /universities/1.xml >>>> def destroy >>>> @university = University.find(params[:id]) >>>> @university.destroy >>>> >>>> respond_to do |format| >>>> format.html { redirect_to(universities_url) } >>>> format.xml { head :ok } >>>> end >>>> end >>>> end >>>> >>>> Thanks, >>>> Jen. >>>> >>>> -- >>>> 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org >>>> For more options, visit this group at >>>> http://groups.google.com/group/rubyonrails-talk?hl=en. >>>> >>>> >> -- >> 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org >> To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org >> For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en. >>-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.