-1

我想弄清楚如何抓住一個名爲「餐」的對象的當前實例來創建屬於它的食物對象。嘗試從父對象控制器創建一個子類對象

它可以在控制檯...其簡單,是這樣的:

user = User.first 
user.meal.first.meal_foods.create 

用戶可以有很多餐,每餐可以有很多meal_foods。

對我來說,挑戰在於創造食物控制器的食物控制器的創建行爲。

(我在這裏使用STI因此,「食品」控制器和「meal_food」名稱)

目前創建操作是這樣的:

@food = current_user.meal.meal_foods.build 

我也試過這個,因爲東西複數化的對象名工作

@food = current_user.meal.meal_food.build 

下面是它給出了兩個

錯誤210
undefined method `meal_foods' for [#<Meal id: 17, user_id: 1, meal_name: "Meal">]:ActiveRecord::Relation 

更新:

我專門爲這裏的問題是選擇正確的進餐創造一個meal_food。

在控制檯中,我可以選擇第一個,這很好。但在食品控制器中,我需要選擇正確的膳食爲其創建膳食。

Writing meals.first將爲該用戶選擇第一餐。如果我想選擇5人中的第三餐,我需要想出一個方法來獲取該餐的ID。

我只是嘗試這樣做:

<%= link_to "new food", foods_path(id: meal.id), method: :create %> 

在meal.id通過爲可在foods_controller使用的參數。然後在foods_controller我所做的:

@meal_food = current_user.meals.find_by_id(params[:id]).meal_foods.build 

看起來像它的提交因爲頁面是一個成功的消息重新加載,但meal_food沒有創建,所以它只是不會顯示出來。

我在控制檯中檢查,並沒有新的食物正在爲此用戶的第一餐創建。


好吧,我意識到,我在上面寫了的link_to創建此網址:因爲PARAMS

foods?id=29 

,我使用來獲取此ID不是工作方法[: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> 
+0

你可能想添加在全模型的定義。否則,它必須找出問題所在。似乎在'用餐'和'用餐食品'之間沒有'has_many'關聯。 – wintermeyer 2013-04-06 09:35:23

+0

好的我已經添加了模型和一些臨時演員以防萬一 – 2013-04-06 14:17:21

+0

-1錯誤消息非常明確 – kikuchiyo 2013-04-06 16:33:05

回答

1

幾件事情:

  1. 「的has_many:一頓,取決於:摧毀」 應爲 「的has_many:餐,取決於:消滅」 的has_many協會名稱使用複數。如果你只需要一個,請使用has_one。
  2. 這一行是錯誤的:@food = current_user.meal.meal_food.build,因爲meal是一個has_many,所以你需要一個「first」。此外,它不返回食物,但一個meal_food,所以你應該這樣說,否則你是在混淆自己:

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

它對我來說MealFood =>更好的名字是Serving。然後你的餐可以有多份,每份都可以有食物。不是一個錯誤,只是更容易理解。然後你會有下面的代碼。請注意,我沒有在性傳播感染中看到食物的重要性 - 只需將食物中的食物數量放在食物表中就可以了,因此根本不需要性傳播感染。

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

+0

感謝您的回覆! 我將不得不按照您的解釋來實施服務設計,因爲無論如何,這種設計本質上是有缺陷的。 雖然有一個問題:如果我在特定用戶的第一次和最後一頓飯之間的中間某處添加了meal_foods,該怎麼辦? – 2013-04-06 19:55:09

1

有時你說User.meal.meal_foods,有時候你會說User.meal.first.meal_foods。 User.meal是Meals的一個數組,因此可以從控制檯User.meal.first.meal_foods工作,並且在您的代碼中User.meal.meal_foods不會給您提供任何方法錯誤。此外,你應該在你的代碼中使用複數餐,並用has_many餐更換has_many餐。

+0

感謝您的提示。我做了複數變化。 – 2013-04-06 19:49:44

+0

np。我試圖給你答案,而不用逐字逐句拼寫,因爲它是一個非常簡單的修復方法 - 你在問題中自己回答了問題,你在控制檯中選擇陣列元素的狀態,但是在你的代碼中嘗試訪問模型陣列上的模型方法。見上面 - 「User.meal是Meals的數組,因此來自控制檯User.meal.first.meal_foods工作,並且在你的代碼中User.meal.meal_foods不會給你任何方法錯誤。」 – kikuchiyo 2013-04-07 00:49:32

+0

是。我明白了。謝謝! – 2013-04-07 14:33:39