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

Ruby on rails 未定义的方法错误,但我定义了它!,ruby-on-rails,Ruby On Rails,Rails新手,正在尝试让一个新的控制器工作 当我试图显示一个现有实例时,我在助手方法上得到一个未定义的方法错误。 代码如下。 知道为什么getRecipes没有定义吗 控制器: def show id = params[:id] recipe_ids = ConcreteMenu.getRecipes(id) respond_to do |format| format.html end end 模型 需

Rails新手,正在尝试让一个新的控制器工作

当我试图显示一个现有实例时,我在助手方法上得到一个未定义的方法错误。 代码如下。 知道为什么getRecipes没有定义吗

控制器:

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

       respond_to do |format|
          format.html
       end
  end
模型

需要“json/objects”
类ConcreteMenu:菜单\u食谱
属于:菜单
def self.getRecipes(id)
recipes=MenuRecipe.find(:all,:conditions=>{:concrete\u menu\u id=>id},:select=>'id')
结束
结束

正如您在这里定义的那样,它应该是可用的。您是否有可能定义了另一个名为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

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

如果您在其中定义了它,它应该是可用的。您是否有可能定义了另一个名为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

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

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

def show
  @concrete_menu = ConcreteMenu.find(params[:id], :include => :recipes)
end
现在您将拥有menu对象,
@concrete\u menu.recipes
返回您需要的配方数组。此功能已内置,无需重新设计轮子


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

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

def show
  @concrete_menu = ConcreteMenu.find(params[:id], :include => :recipes)
end
现在您将拥有menu对象,
@concrete\u menu.recipes
返回您需要的配方数组。此功能已内置,无需重新设计轮子


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

我强烈建议重构为首选的Ruby风格
def self.foo
,而不是
def self.getFoo
。另一件事,在Ruby方法中,像这样命名。你来自Java吗?你能发布你的堆栈跟踪吗?我想说这个问题超出了你发布的代码范围。另外,我同意Eli的观点,并补充说Ruby的惯例是snake_case,而不是camelCase。我强烈建议重构为首选的Ruby风格
def self.foo
,而不是
def self.getFoo
。另一件事,在Ruby方法中,像这样命名。你来自Java吗?你能发布你的堆栈跟踪吗?我想说这个问题超出了你发布的代码范围。此外,我同意Eli的观点,并补充说Ruby的惯例是snake_案,而不是camelCase案。