0

ここで何かが欠けているか、Rails モデルの関連付けについての私の理解がまだ十分ではありません (まだ学習中です)。レシピと材料の 2 つのモデルがあります。レシピには多くの材料があり、フォームに入力するときに、レシピと材料のパラメーターをそれぞれのデータベースに投稿したい

レシピモデル

 class Recipe < ActiveRecord::Base

 attr_accessible :dish_name, :country_of_origin, :difficulty, :preperation_time
 has_many :ingredients

 end

成分モデル

 class Ingredient < ActiveRecord::Base
belongs_to :recipe
attr_accessible :ingredients
end

レシピコントローラー

 def new 

 @recipe = Recipe.new

 end

 def create

 @recipe = Recipe.new(params[:recipe])
 if @recipe.valid?
 @recipe.save
 redirect_to recipes_path, :notice => "Recipe sucessfully created."
 else
 flash.now.alert = "Please ensure all fields are filled in."
 render :new

 end
end

成分コントローラー

  def new
  @ingredient = recipes.find(params[:recipes_id].ingredients.new
  @recipe_id = params[:recipe_id]
  end

<%= form_for @recipe  do |f| %>

<%= f.label :dish_name, "Dish Name" %>
<%= f.text_field :dish_name, :placeholder => "Enter Dish Name" %>

more fields here(wanted to keep as short as poss)

<%= f.label :ingredients, "Ingredients" %>
<%= f.text_field :ingredients , :class => :ingred, :placeholder => "Enter Ingredient Here" %><br>
<% end %>

コードのサイズについてお詫びします。レシピを作成できない理由を確認するために他に何か必要ですか?

4

2 に答える 2

1

まず、Ingredient モデルに「recipe_id」などの外部キー列が含まれていますか?

また、特定のレシピの材料が 1 つのテキスト文字列に格納されているだけの場合、2 つ目のモデルを作成する代わりに、レシピ モデルでその列を作成しないでください。あるいは、1 つのレシピに複数の材料を関連付ける場合は、モデル属性がネストされたフォームを調べる必要があります。ここには良いレールがキャストされています

お役に立てれば。

于 2012-11-03T00:45:54.693 に答える
0

あなたのコードはこれにリンクするものでなければなりません...

---モデル---

class Recipe < ActiveRecord::Base
 attr_accessible :dish_name, :country_of_origin, :difficulty, :preperation_time, :ingredients_collection
 has_many :ingredients
 def ingredients_collection
   self.ingredients.collect(&:name).join(" ,")  
 end
 def ingredients_collection(ingredients)
   ingredients.each do |ingredient|
   i = Ingredient.create(:name => ingredient)    
   self.ingredients << i
 end
 end
 end

class Ingredient < ActiveRecord::Base
  belongs_to :recipe
  attr_accessible :name # you should have some valid attribute name as it would conflict with the ingredients which is a method defined by the association (:has_many) in the instance of the Recipe...
  end

- - コントローラ - -

def new
 @recipe = Recipe.new
end
def create
  @recipe = Recipe.new(params[:recipe])
  if @recipe.save # no need to call the valid the validations would take care of it by themselves
    redirect_to recipes_path, :notice => "Recipe sucessfully created."
  else
    flash.now.alert = "Please ensure all fields are filled in."
    render :new
  end
end

材料のコントローラーを定義する必要はありません...特定のレシピの材料をレシピインスタンスのみから定義します...

- -形 - -

 <%= form_for @recipe  do |f| %>
   <%= f.label :dish_name, "Dish Name" %>
   <%= f.text_field :dish_name, :placeholder => "Enter Dish Name" %>
      more fields here(wanted to keep as short as poss)
   <%= f.label :ingredients, "Ingredients" %>
   <%= f.text_field :ingredients_collection , :class => :ingred, :placeholder => "Enter Ingredient Here" %><br>
  <% end %>

仮想属性について学習することをお勧めします。状況とニーズを考えると、それは完全に適合すると思います...

http://railscasts.com/episodes/16-virtual-attributesから仮想属性について読む

于 2012-11-03T05:33:56.697 に答える