我正在创建一个注册,其中我有“人”“儿童”和“膳食”模型。人可以有很多孩子,可以为自己注册许多餐,但也有很多儿童餐。
关键是餐点只属于人(没有把它分配给孩子们)所以我有一个创作部分用于表格中的膳食,还有另一个创作部分。
当我提交表单时,我得到了无法在Person控制器中批量分配受保护的属性:饭错误。
问题是,我怎样才能在Children fields_for部分下创建Meals实例而不会出现此错误并且没有在Meals和Children之间建立连接?
这是我的人物模型
class Person < ActiveRecord::Base
has_many :meals
has_many :registrations, :dependent => :destroy
has_many :programs, :through => :registrations
has_many :children
attr_accessible :email_address, :first_name, :home_country, :payment, :phone_number, :price_category, :price_method, :reference_number, :second_name, :meals_attributes, :registrations_attributes, :children_attributes
validate :first_name, :second_name, :home_country, :email_address, :payment, :price_method, :presence => true
accepts_nested_attributes_for :meals, :allow_destroy => true, :reject_if => proc { |attributes| attributes['meal_type'].blank? }
accepts_nested_attributes_for :registrations, :allow_destroy => true
accepts_nested_attributes_for :children, :allow_destroy => true
我的膳食模型
class Meal < ActiveRecord::Base
attr_accessible :food_type, :meal_date, :meal_type, :person_id, :meal_id
validate :food_type, :meal_date, :meal_type, :presence => true
belongs_to :person
end
我的人物控制器的新部分
def new
@person = Person.new
meal = @person.meals.build
@meal_dates = ["2013-07-09","2013-07-10","2013-07-11","2013-07-12","2013-07-13","2013-07-14"]
registration = @person.registrations.build
child = @person.children.build
@programs = Program.all
respond_to do |format|
format.html # new.html.erb
format.json { render json: @person }
end
这是主_form
中的子部分<h2>Children</h2>
<%= f.fields_for :children do |builder| %>
<%= render "child_fields", :f => builder %>
<% end %>
<%= link_to_add_fields 'Add Children', f, :children %>
和孩子一起吃饭
<fieldset>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :age %><br />
<%= f.number_field :age %>
</div>
<div class="field">
<%= f.label :language %><br />
<%= f.text_field :language %>
</div>
<div class="field">
<%= f.label :child_care %><br />
<%= f.check_box :child_care %>
</div>
<h3>Child's meals</h3>
<table>
<tr>
<th>Date</th>
<th>Food type</th>
<th>Meal type</th>
</tr>
<% @meal_dates.each do |meal_date| %>
<%= f.fields_for :meals do |f3| %>
<tr>
<td><%= f3.text_field :meal_date, :value => meal_date %></td>
<td><%= f3.hidden_field :food_type, :class => 'FoodType', :value => 'vegetarian'%></td>
<td><%= f3.select(:meal_type, [['Lunch', 1], ['Three Meals', 3], ['None', nil]]) %></td>
</tr>
<% end %>
<% end %>
</table>
<%= f.hidden_field :_destroy %>
<%= link_to "remove", '#', class: "remove_fields" %>
</fieldset>
您可以在我的github中找到完整的代码:https://github.com/szabcsee/brk2013
答案 0 :(得分:1)
IMO建模有点混乱。
与常识不同,膳食模型实际上是一种顺序。考虑到这一点,我基本上可以理解逻辑。
要解决您的问题,我建议在膳食(订单)模型中添加一个字段。该领域是存储谁将吃这顿饭。名称可以是for_whom
,eater
或任何可以理解的名称。
这个字段的默认值是0,这意味着这顿饭是为了这个人自己的。(为什么不是这个人的id?因为你需要使用这个字段搜索孩子的id。这个人的id已经存储在orderer中)
当一个人订餐时,他会看到一个选项(无线电或选择),询问他该用餐的对象。该选项将填充id或他的孩子以及他自己(为0)。
处理表单时,如果选项值大于0,则表示孩子的id。然后你可以相应地处理它。
要显示孩子的用餐,只需查看带有孩子身份证的餐桌。