0

「人」「子供」および「食事」モデルがある登録を作成しています。人は多くの子供を持つことができ、自分自身のために多くの食事を登録することができますが、子供のための多くの食事を登録することもできます。

ポイントは、食事は人だけに属していることです (子供に割り当てるポイントはありません)。そのため、フォーム内の食事用の 1 つの作成部分と、子供の下の別の作成部分があります。

フォームを送信すると、保護された属性を一括割り当てできません:人のコントローラーで食事エラーが発生します。

質問は、このエラーが発生せず、食事と子供の間の接続を構築せずに、子供の fields_for セクションの下に食事インスタンスを作成するにはどうすればよいですか?

ここに私の人物モデルがあります

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

Person コントローラーの新しい部分

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

4

1 に答える 1

1

IMO のモデル化には少し混乱があります。

常識とは異なり、食事モデルは実際には一種の注文です。これを念頭に置いて、私は基本的にロジックを理解することができます.

あなたの問題を解決するには、Meal(order) モデルにフィールドを追加することをお勧めします。フィールドは、誰がこの食事を食べるかを格納するためのものです。名前はfor_whomeaterまたはわかりやすい名前にすることができます。

このフィールドのデフォルト値は 0 で、これはこの食事がこの人自身のためのものであることを意味します。

人が食事を注文すると、オプション (Radios または Select) が表示され、誰のための食事かを尋ねられます。オプションには、ID または彼の子供、および彼自身 (0 として) が取り込まれます。

フォームを処理するとき、オプション値が 0 より大きい場合、それは子の ID を意味します。その後、それに応じて処理できます。

子供の食事を表示するには、子供の ID で食事テーブルをクエリします。

于 2013-05-05T13:05:02.797 に答える