0

私は同様の質問を検索してきましたが、それでもこの関係をどのように実装するかがわかりません。もちろん3つのモデルがあります:

class Recetum < ActiveRecord::Base
    attr_accessible :name, :desc, :duration, :prep, :photo, :topic_id
    has_many :manifests
    has_many :ingredients, :through => :manifests
end

class Ingredient < ActiveRecord::Base
  attr_accessible :kcal, :name, :use, :unity
  has_many :manifests
  has_many :recetum, :through => :manifests
end


class Manifest < ActiveRecord::Base
  attr_accessible :ingredient_id, :quantity, :receta_id
  belongs_to :recetum
  accepts_nested_attributes_for :ingredient
  belongs_to :ingredient
end

Recetumはレシピ(足場の場合はタイプミス)になります。このレシピには1つ以上の材料が含まれている場合があります(すでにdbにあります)。したがって、新しいレセタムを作成するときは、新しいレセタムを作成し、ユーザーが入力した材料ごとに1つのレコードをマニフェストに挿入する必要があります。

ビューとコントローラー、材料のフィールドを含むレセタムのフォームを作成するにはどうすればよいですか、さらに重要なのはレセタムコントローラーを変更する必要があることです。

この部分は私のプロジェクトにとって非常に重要であるため、提案や支援をいただければ幸いです。よろしくお願いします。

4

1 に答える 1

0

あなたにはいくつかの選択肢があり、主にそれらはあなたがあなたの見解で何をしたいかに依存します。設定された数を表示しますか、max_ingredientsそれとも完全に動的にしますか?動的なケースは確かにユーザーにとっては見栄えがしますが、より複雑なコードになります。

これは、JavaScriptを介して動的に行う方法を説明する優れたRailsCastです。

http://railscasts.com/episodes/74-complex-forms-part-2

残念ながら、すべての人がJavaScriptを有効にして実行しているわけではないため、静的な方法で実行することを検討することをお勧めします。

まず、モデルに必要accepts_nested_attributes_forはないと思います。しかし、私はあなたがあなたのモデルManifestでそれを必要とすると思います。静的ルートを使用する場合は、オプションもRecetum設定することをお勧めします。reject_if

accepts_nested_attributes_for :manifests, reject_if: :all_blank

これを行ったら、に追加manifests_attributesする必要がありますattr_accessible

静的ルートでは、いくつかのを事前に構築する必要がありますmanifests。コントローラでは、new次のようなものが必要になります。

max_ingredients.times do
  @recetum.manifests.build
end

editとのエラーパスでは、次のことが必要になる場合がありcreateます。update

(max_ingredients - @recetum.manifests.count).times do
  @recetum.manifests.build
end

最後に、あなたの見解は成分を設定するための何らかの方法を必要とします。今のところ、選択ボックスを想定します。

f.fields_for :manifests do |mf|
  mf.label :ingredient_id, "Ingredient"
  mf.collection_select :ingredient_id, Ingredient.all, :id, :name

おそらく、リストまたはテーブルを介して、ある種のフォーマットを追加することをお勧めします。

うまくいけば、それはあなたが始めるのに十分です。

于 2013-01-14T16:52:01.633 に答える