2014-04-06 109 views
0

即使在声明辅助方法之后,错误仍然是Item的未定义方法'get_image_url'。未定义方法rails - 从视图调用控制器方法

尽管我不明白为什么视图中的某些东西应该明确地启用来调用控制器方法。

这是模型法

def item_url 
    return self.image_url # simplified version for simplicities sake 
end 

,并在控制器

def get_image_url 
    Item.item_url 
end 
helper_method :get_image_url 

视图

<% @items.each do |item| %> 
    <img src="<%= item.get_image_url%>"></img> 
<% end %> 

我不知道该怎么做这个,我觉得我的设计并不理想,我需要更多经验丰富的开发人员提供一些反馈。啊

回答

1

首先,你想如果你在一个“裸”模型打电话来从非启动的对象调用一个实例方法

item_url应该是class method,或者应该初始化调用实例方法:

#Instance 
def get_image_url 
    @item = Item.find(1) 
    @item.item_url 
end 

#Class 
def get_image_url 
    Item.item_url 
end 

def self.item_url 
    item = find(1) 
    item.image_url 
end 

你有下一个问题是你打电话,你认为什么是一个实例方法作为helper。问题是你直接引用你的模型,并应通过模型来完成


修复

没有意义调用get_image_url方法 - 你只是路由到一个模型的方法呢。您应该在模型中将item_url重命名为get_image_url,并将其作为您视图中的实例方法进行调用。因为你的clothing_item对象是你Item模型的初始化版本,你就可以在其上使用的实例方法没有问题:当你调用像get_image_url的方法Item类,Rails的物体上

<% @clothing_items.each do |clothing_item| %> 
    <img src="<%= clothing_item.get_image_url%>"></img> 
<% end %> 

#app/models/item.rb 
def get_image_url 
    image_url # simplified version for simplicities sake 
end 
1

item.rb中寻找Item类定义中的方法定义。但Rails在那里找不到它。因此,Rails说这个方法是不确定的。

另一个问题是Item.item_url。这是调用Item类本身的方法,而不是该类的对象或对象。因此,您需要在Item模型中将方法item_url定义为类方法(而不是实例方法)。

但是,在这里,如果您的目标是分别显示每个项目的图像,我认为您不需要使用类方法。您可以直接使用您的视图文件,并在您的模型中将get_image_url定义为实例方法。

相关问题