未定义的方法错误,但我定义了它!

时间:2010-01-26 18:46:10

标签: ruby-on-rails

Rails新手在这里,试图让一个新的控制器工作。

当我尝试显示现有实例时,我在辅助方法上得到一个未定义的方法错误。 代码如下。 知道为什么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

2 个答案:

答案 0 :(得分:2)

如果您粘贴错误文本会有所帮助,因为您的解释会为可能出错的地方留下很多可能性。 但是,有一种更简单的方式来获得你想要的东西。定义“has_many”关系的价值在于,您可以执行以下操作,而不是调用类方法并传递具体菜单的id来获取其相关的食谱:

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

现在您将拥有菜单对象,@concrete_menu.recipes将返回您需要的一系列食谱。此功能已内置,无需重新发明轮子。

另外,我注意到你试图在控制器中收集id而不是对象本身。这表明你要返回并实际检索视图本身的记录。这样效率较低,并且在出现问题时更难以排除故障。我上面的例子将以更好的(以及更多的铁路接受)方式完成您的需要。

答案 1 :(得分: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

定义的任何实例变量(@ ...)将在视图的上下文中可用,但不再定义任何局部变量,因为它们超出了范围。