-1

「食事」というオブジェクトの現在のインスタンスを取得して、それに属する食品オブジェクトを作成する方法を見つけようとしています。

コンソールで動作します... シンプルで、次のようになります。

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> 
4

2 に答える 2

1

Sometimes you say User.meal.meal_foods, sometimes you say User.meal.first.meal_foods. User.meal is an array of Meals, hence from console User.meal.first.meal_foods works, and in your code User.meal.meal_foods gives you no method error. Also, you should use plural meals in your code and swap out has_many meal with has_many meals.

于 2013-04-06T16:25:45.613 に答える
1

いくつかのこと:

  1. "has_many :meal,dependent: :destroy" は "has_many :meals,dependent: :destroy" にする必要があります。 has_many 関連名は複数形です。ここで 1 つだけが必要な場合は、代わりに has_one を使用してください。
  2. この行は間違っています: @food = current_user.meal.meal_food.build。食事は has_many であるため、「最初」が必要です。また、これは食べ物ではなく、meal_food を返すので、次のように言う必要があります。そうしないと、混乱することになります。

    @meal_food = current_user.meal.first.meal_food.build

MealFood => の場合、より適切な名前は Serving になると思います。次に、あなたの食事には多くのサービングがあり、各サービングには食べ物があります。間違いではなく、よりわかりやすいです。次に、次のコードがあります。私は食べ物に対する STI の要点を理解していなかったことに注意してください - 食べた食べ物の量をサービング表に単純に入れる方がはるかに理にかなっており、そうすれば STI はまったく必要ありません.

  class Meal < ActiveRecord::Base
    before_save :sanitize
    has_many :servings
    has_many :foods, :through => :servings
    attr_accessible :meal_name

    def sanitize
      self.meal_name = "Meal"
    end
  end 


  class Food < ActiveRecord::Base
    attr_accessible :brand, :carbs, :fat, :name, :protein, :type
    has_many :servings, :inverse_of => :food
  end   

  class Serving < ActiveRecord::Base
    attr_accessible :amount
    has_many :foods
    has_many :meals
  end 

  class User < ActiveRecord::Base
    has_many :meals, dependent: :destroy
  end

HTH

于 2013-04-06T16:36:06.757 に答える