私は次のモデルを持っています:
class MealPlan < ActiveRecord::Base
has_many :food_contents
has_many :foods,:through => :food_contents
accepts_nested_attributes_for :food_contents
attr_accessible :food_contents_attributes,:name
end
class Food < ActiveRecord::Base
validates_presence_of :name,:protein,:carbs,:fats,:calories
validates_numericality_of :protein,:carbs,:fats,:calories
end
class FoodContent < ActiveRecord::Base
belongs_to :meal_plan
belongs_to :food
attr_accessible :food_id, :how_much,:meal_plan_id
validates_presence_of :food,:meal_plan
end
食事プランコントローラーに次のコードがあります。
def new
@meal_plan = MealPlan.new
3.times { @meal_plan.food_contents.build }
end
def create
@meal_plan = MealPlan.new(params[:meal_plan])
end
および食事プランの次のフォーム:
<%= form_for(@meal_plan) do |f| %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<%= f.fields_for :food_contents do |b| %>
<fieldset>
<legend>New food</legend>
<%= b.collection_select :food_id,Food.all,:id,:name,{},{:class => "food_id_selector"} %><br/>
<%= b.text_field :how_much,:class => "how_much_input" %><br/>
<%= content_tag(:p,nil,:class => "food_acumulator") %>
</fieldset>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
ただし、モデルの保存に常に失敗すると、次のエラーが発生します。
> #<ActiveModel::Errors:0xb34212e8
@base=#<MealPlan id: nil, name: "Sample", created_at: nil, updated_at: nil>,
@messages={:"food_contents.meal_plan"=>["can't be blank"]}>
私がデバッグしたものから、犯人はvalidates_presence_of :meal_plan
次のとおりです。
class FoodContent < ActiveRecord::Base
...
...
validates_presence_of :food,:meal_plan
end
一方では、ネストされたモデルを保存できない理由を理解できますが (食事プランにはまだ ID がないため)、もう一方の側では、自分が行っていることが正しいことを確認したいと考えています。