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
答案 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
定义的任何实例变量(@ ...)将在视图的上下文中可用,但不再定义任何局部变量,因为它们超出了范围。