Nested Models are not connecting/connected

I'm attempting to make a basic CRUD/data entry cookbook. I've got a recipe model that is composed of other models. I'm intending of using a single form to create the recipes such that n ingredients and n instructions can be associated to a single recipe.

I understand why it's not happening I just don't know how to make it stop.

This is what I have so far as far as models and schema.rb:

class Direction < ActiveRecord::Base     belongs_to :recipe

    validates :number, :presence => true     validates :instruction, :presence => true

    def step       "#{number}.) #{instruction}"     end end

class Ingredient < ActiveRecord::Base   has_one :measurement   belongs_to :recipe   validates :measurement, :presence => true   validates :quantity, :presence => true   validates :food, :presence => true end

class Measurement < ActiveRecord::Base   belongs_to :ingredient end

class Recipe < ActiveRecord::Base   has_many :ingredients   has_many :directions

  validates :title, :presence => true   validates :description, :presence => true

  accepts_nested_attributes_for :ingredients, :reject_if => proc { |a| a[:food].blank? }   #accepts_nested_attributes_for :ingredients, :reject_if => proc { |a| a[:food].blank? }   #we want to resuse ingredients if possible

  accepts_nested_attributes_for :directions   #accepts_nested_attributes_for :directions, :reject_if => proc { |a| a[:instruction].blank? }, :allow_destroy => true   #there should not be an issue with deleting directions associated to a deleted recipe

  #Ruby Programming/Syntax/Method Calls - Wikibooks, open books for an open world end

# This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition.

So what's not working? The models you posted should be ok as long as the forms are ok too (there's also a railscast or 2 on this subject)

Fred

R. K. wrote in post #987926:

I'm attempting to make a basic CRUD/data entry cookbook. I've got a recipe model that is composed of other models. I'm intending of using a single form to create the recipes such that n ingredients and n instructions can be associated to a single recipe.

I understand why it's not happening I just don't know how to make it stop.

This is what I have so far as far as models and schema.rb:

class Direction < ActiveRecord::Base     belongs_to :recipe

    validates :number, :presence => true     validates :instruction, :presence => true

    def step       "#{number}.) #{instruction}"     end end

class Ingredient < ActiveRecord::Base   has_one :measurement   belongs_to :recipe   validates :measurement, :presence => true   validates :quantity, :presence => true   validates :food, :presence => true end

class Measurement < ActiveRecord::Base   belongs_to :ingredient end

class Recipe < ActiveRecord::Base   has_many :ingredients   has_many :directions

  validates :title, :presence => true   validates :description, :presence => true

  accepts_nested_attributes_for :ingredients, :reject_if => proc { |a| a[:food].blank? }   #accepts_nested_attributes_for :ingredients, :reject_if => proc { |a| a[:food].blank? }   #we want to resuse ingredients if possible

  accepts_nested_attributes_for :directions   #accepts_nested_attributes_for :directions, :reject_if => proc { |a| a[:instruction].blank? }, :allow_destroy => true   #there should not be an issue with deleting directions associated to a deleted recipe

  #Ruby Programming/Syntax/Method Calls - Wikibooks, open books for an open world end

# This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # # Note that this schema.rb definition is the authoritative source for your # database schema. If you need to create the application database on another # system, you should be using db:schema:load, not running all the migrations # from scratch. The latter is a flawed and unsustainable approach (the more migrations # you'll amass, the slower it'll run and the greater likelihood for issues). # # It's strongly recommended to check this file into your version control system.

ActiveRecord::Schema.define(:version => 20110314191853) do

  create_table "directions", :force => true do |t|     t.integer "recipe_id"     t.integer "number"     t.text "instruction"     t.datetime "created_at"     t.datetime "updated_at"   end

  create_table "ingredients", :force => true do |t|     t.integer "measurement_id"     t.string "quantity"     t.string "food"     t.datetime "created_at"     t.datetime "updated_at"   end

  create_table "measurements", :force => true do |t|     t.string "size"     t.float "quantity"     t.datetime "created_at"     t.datetime "updated_at"     t.string "abbreviation"     t.string "measurement"     t.string "measurement_type"     t.string "equivalent"   end

  create_table "recipes", :force => true do |t|     t.integer "ingredient_id"     t.integer "direction_id"     t.string "title"     t.text "description"     t.datetime "created_at"     t.datetime "updated_at"     t.string "source"     t.string "image"     t.string "cooktime"   end

  create_table "sessions", :force => true do |t|     t.string "session_id", :null => false     t.text "data"     t.datetime "created_at"     t.datetime "updated_at"   end

  add_index "sessions", ["session_id"], :name => "index_sessions_on_session_id"   add_index "sessions", ["updated_at"], :name => "index_sessions_on_updated_at"

end

Basically, children need to know their parents. Take a look in the log at the queries generated, and you'll see items like:

Querying to show a recipe with id = 1: SELECT 'directions'.* FROM 'directions' WHERE ('directions'.recipe_id = 1)

So:

Recipe (top of the food chain - haha)   # table has no <model>_id fields   has_many :ingredients   has_many :directions

Ingredient   belongs_to :recipe # table must have recipe_id   has_one :measurement

Measurement   belongs_to :ingredient # table must have ingredient_id

Direction   belongs_to :recipe # table must have recipe_id

That should make your app happier.

Frederick Cheung wrote in post #987930:

So what's not working? The models you posted should be ok as long as the forms are ok too (there's also a railscast or 2 on this subject)

Fred

Yes Fred and examining my code some more (with the advice I got from here) that's my conclusion as well.

I am however getting a different error after tweaking the form a bit. In short I want to dynamically add my ingredients to my recipe so I can have N ingredients. I am using jquery to accomplish this i.e. default to one ingredient with a button to add the N that follow.

Here is my current error:

ActionController::RoutingError in Recipes#new

Showing /Users/mkidd/Sites/cookbook/app/views/recipes/_form.html.erb where line #34 raised:

No route matches {:action=>"new", :controller=>"ingredients", :format=>:js, :recipe_id=>#<Recipe id: nil, ingredient_id: nil, direction_id: nil, title: nil, description: nil, source: nil, image: nil, cooktime: nil, created_at: nil, updated_at: nil>}

Extracted source (around line #34):

31: </fieldset> 32: <div id="ingredients"> 33: <h3>Ingredients</h3> 34: <%= link_to "Add Ingredient", new_recipe_ingredient_path(@recipe, :format => :js), :remote => true, :id => 'new_ingredient_link' %> 35: </div> 36: <%# <p><%= link_to_add_ingredient "Add Ingredient", f, :ingredients #%><%#</p> #%> 37: <%# <p><%= link_to_add_fields "Add Ingredient", f, :ingredients #%><%#</p> #%>

Looking at this error again I thought i had it by looking at my routes but I lost it. My routes don't paste that well though.

And to stop cutting and pasting here is my github for the current codebase: GitHub - mkidd/cookbook