2010-01-26 144 views
0

Rails新手在這裏,試圖讓一個新的控制器工作。未定義的方法錯誤,但我定義了它!

當我嘗試顯示ann存在的實例時,我得到一個輔助方法未定義的方法錯誤。 代碼如下。 任何想法爲什麼getRecipes將不確定?!

控制器:

def show 
     id = params[:id] 
     recipe_ids = ConcreteMenu.getRecipes(id) 

     respond_to do |format| 
      format.html 
     end 
    end 

型號

require 'json/objects' 

class ConcreteMenu < ActiveRecord::Base 
    has_many :menu_recipes 
    has_many :recipes, :through => :menu_recipes 

    belongs_to :menu 

    def self.getRecipes(id) 
     recipes = MenuRecipe.find(:all, :conditions => {:concrete_menu_id => id}, :select => 'id') 
    end 
end 
+1

我強烈建議重構到'def self.foo'的首選Ruby風格,而不是'def self.getFoo'。 – Eli 2010-01-26 18:48:59

+0

另一件事,在ruby methods_are_named_like_this。你來自Java嗎? – jonnii 2010-01-26 18:58:11

+0

你可以發佈你的堆棧跟蹤嗎?我會說這個問題在你發佈的代碼之外。另外,我同意Eli的觀點,並補充說Ruby的約定是snake_case,而不是camelCase。 – Ben 2010-01-26 19:00:12

回答

2

如果你粘貼了錯誤文本,這將有所幫助,因爲你的解釋給出了很多可能出錯的可能性。 但是,有一種更簡單的方法來獲得你想要的。定義「的has_many」關係的價值是不是調用一個類的方法,並通過一個具體的菜單,以獲取其相關聯的方案的ID,你可以這樣做:

def show 
    @concrete_menu = ConcreteMenu.find(params[:id], :include => :recipes) 
end 

現在你將有菜單對象和@concrete_menu.recipes返回您需要的食譜數組。此功能已內置,無需重新發明輪子。

另外,我注意到你試圖在控制器中收集id而不是對象本身。這表明您將返回並實際檢索視圖本身中的記錄。這是效率較低,並且在出現問題時更難以排除故障。我上面的例子將會以更好的(和更多的rails接受)的方式做你需要的。

1

當你擁有了它在那裏定義,它應該是可用的。是否有機會定義另一個名爲ConcreteMenu的東西,但在不同的環境中?

要確保你調用正確的,其中可能有歧義,可以指的是頂層類:

recipe_ids = ::ConcreteMenu.getRecipes(id) 

的另一種方法來檢查:該方法是通過正確定義腳本/控制檯:

ConcreteMenu.methods.grep(/getRecipe/) 
# => ["getRecipes"] 

這是假設,當然,你有getRecipes方法的麻煩。有一種可能性,你弄錯控制變量是如何傳遞給視圖:

def show 
    @id = params[:id] 
    @recipe_ids = ConcreteMenu.getRecipes(@id) 

    respond_to do |format| 
     format.html 
    end 
end 

定義的任何實例變量(@ ......)將是視圖的範圍內使用,但任何局部變量將不再被定義爲超出範圍。