2010-01-26 143 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 

定义的任何实例变量(@ ......)将是视图的范围内使用,但任何局部变量将不再被定义为超出范围。