Hi folks.
I'm trying to do stuff with models nested one layer deeper than I've
done in the past...and it's just not working properly. Here's the
situation:
* I have three models involved here: Recipe, IngredientLine, and
Ingredient (it's a cookbook application).
class Recipe < ActiveRecord::Base
has_many :ingredient_lines
has_many :ingredients, :through => :ingredient_lines
end
class IngredientLine < ActiveRecord::Base
belongs_to :ingredient
belongs_to :recipe
end
class Ingredient < ActiveRecord::Base
has_many :ingredient_lines
has_many :recipes, :through => :ingredient_lines
end
* I'm trying to develop a form which edits a Recipe along with its
associated IngredientLines and Ingredients. Right now, I've been
working with this sort of thing (it's a Facebook app, hence the .fbml
extension, and I'm only doing relevant excerpts so as not to take up
too much space here):
--- recipe/views/new.fbml.haml ---
- form_for(@current_object) do |f|
= f.text_field :name
= render :partial => 'ingredient', :locals => {:f => f}
= f.text_area :instructions
--- recipe/views/_ingredient.fbml.haml ---
- f.fields_for :ingredient_lines, :index => nil do |ff|
%td= ff.text_field :quantity, :size => 3, :maxlength => 3, :id =>
nil
%td= ff.text_field :unit, :id => nil
- ff.fields_for :ingredient do |i|
%td= i.text_field :name, :id => nil
* I've tried this with fields_for instead of f.fields_for as well.
* There's some JavaScript to produce multiple copies of the partial
for multiple ingredient, but I'm omitting that since it's not relevant
here.
* The HTML/FBML output for this is as expected:
<form action="/recipes" class="new_recipe" id="recipe_1015"
method="post">
<input id="recipe_name" name="recipe[name]" size="30" type="text" />
<input id="recipe_ingredient_lines__quantity" maxlength="3"
name="recipe[ingredient_lines][][quantity]" size="3" type="text" />
<input id="recipe_ingredient_lines__unit" name="recipe
[ingredient_lines][][unit]" size="30" type="text" />
<input id="recipe_ingredient_lines__ingredient_name" name="recipe
[ingredient_lines][][ingredient][name]" size="30" type="text" />
<textarea cols="40" id="recipe_instructions" name="recipe
[instructions]" rows="20"></textarea>
</form>
So far so good. But here's the problem: *submissions don't work quite
properly*. When I fill out the form and submit it, I get params
entries like
"recipe"=>{"name"=>"Recipe", "ingredient_lines"=>[{"quantity"=>"1",
"unit"=>"cup", "ingredient"=>{}}], "instructions"=>"Preheat oven to
350°..."}. Note that ingredient_lines[0].ingredient.name is missing,
even if I enter text in the corresponding form field -- in other
words, what I should be seeing is something like "recipe"=>
{"name"=>"Recipe", "ingredient_lines"=>[{"quantity"=>"1",
"unit"=>"cup", "ingredient"=>{"name" => "flour"}}],
"instructions"=>"Preheat oven to 350°..."}. What am I doing wrong?
Any suggestions would be helpful. Thanks in advance!
Best,