「食事」というオブジェクトの現在のインスタンスを取得して、それに属する食品オブジェクトを作成する方法を見つけようとしています。
コンソールで動作します... シンプルで、次のようになります。
user = User.first
user.meal.first.meal_foods.create
ユーザーは多くの食事をすることができ、各食事には多くの食事_食品を含めることができます。
ここでの課題は、meal_food を作成するときの food コントローラーの create アクションにあります。
(ここでは STI を使用しているため、"foods" コントローラーと "meal_food" という名前です)
現在、作成アクションは次のようになっています。
@food = current_user.meal.meal_foods.build
オブジェクト名を複数形にするものが機能するため、これも試しました
@food = current_user.meal.meal_food.build
両方に与えるエラーは次のとおりです
undefined method `meal_foods' for [#<Meal id: 17, user_id: 1, meal_name: "Meal">]:ActiveRecord::Relation
アップデート:
ここで特に問題になっているのは、meal_food を作成するための正しい食事を選択することです。
コンソールで最初のものを選択できますが、これで問題ありません。しかし、foods コントローラーでは、meal_food を作成する正しい食事を選択する必要があります。
food.first と書くと、そのユーザーの最初の食事が選択されます。5 つのうち 3 つ目の食事を選択したい場合、その食事の ID を取得する方法を考える必要があります。
私はちょうどこれを試しました:
<%= link_to "new food", foods_path(id: meal.id), method: :create %>
food_controller で使用できるパラメータとして、meal.id を渡します。そして、foods_controller で次のことを行いました。
@meal_food = current_user.meals.find_by_id(params[:id]).meal_foods.build
ページが成功メッセージでリロードされるため、送信しているように見えますが、meal_food が作成されていないため、表示されません。
コンソールで確認したところ、このユーザーの最初の食事用に作成された新しい食べ物はありません。
わかりました、上で書いた link_to がこの URL を作成することに気付きました:
foods?id=29
params[:id] はこの URL ID ではなくパス ID を探しているため、この ID を取得するために使用しているメソッドは機能しません。
前もって感謝します!
モデル:
class Meal < ActiveRecord::Base
before_save :sanitize
has_and_belongs_to_many :meal_foods
attr_accessible :meal_name
def sanitize
self.meal_name = "Meal"
end
end
class Food < ActiveRecord::Base
attr_accessible :brand, :carbs, :fat, :name, :protien, :type
end
class MealFood < Food
has_and_belongs_to_many :meals
end
class User < ActiveRecord::Base
has_many :meal, dependent: :destroy
has_many :custom_foods, dependent: :destroy
コントローラー:
class FoodsController < ApplicationController
#functions
def create
#this is where I need to grab the correct meal, and then create a meal_food for it...
if @meal_food.save!
flash[:success] = "Food created successfully!"
redirect_to meal_path(current_user.id)
else
flash[:error] = "Food couldn't be created."
redirect_to meal_path(current_user.id)
end
end
end
パーシャル:
これは、各食事を表示するために繰り返される食事のパーシャルです。下にある食事に属する食事を作成するための link_to があります。
<tr>
<thead class=meal-thead>
<td class=meal-thead-name> <%= meal.meal_name %> </td>
<th> </th>
<th> </th>
<th> </th>
<th> </th>
<th> <%= link_to "x", meal_path(meal.id), method: :delete %> </th>
</thead>
<tbody class=meal-tbody>
<%# get reference to current meal and its foods %>
<%= render meal.meal_foods %>
<td class=remove-td-center> <%= link_to "new food", foods_path, method: :create %> </td>
</tbody>
</tr>