undefined方法rails - 从视图调用控制器方法

时间:2014-04-06 07:42:44

标签: ruby-on-rails ruby-on-rails-4

错误是未定义的方法' get_image_url'对于Item,即使在声明辅助方法之后也是如此。

虽然我不明白为什么应该明确启用视图中的某些内容来调用控制器方法。

这是模型方法

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 %>

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

2 个答案:

答案 0 :(得分:1)

首先,您尝试从非启动对象调用实例方法

item_url如果您正在呼叫裸体&#34;那么#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 应为class method。 model,或者应该初始化为调用实例方法:

helper

您遇到的下一个问题是,您正在调用您认为是get_image_url的实例方法。问题是您直接引用模型,应该通过模型

完成

<强>修正

没有必要调用item_url方法 - 您无论如何都只是路由到模型方法。您应该在模型中将get_image_url重命名为clothing_item,并将其作为实例方法从您的视图中调用。由于您的Item对象是<% @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}}

答案 1 :(得分:1)

当您在类get_image_url的对象上调用Item之类的方法时,Rails会在Item中的item.rb类定义中查找方法定义。但是Rails并没有在那里找到它。因此,Rails说这个方法是未定义的。

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

但是,如果您的目标是单独显示每个项目的图像,我认为您根本不需要使用课程方法。您可以按原样使用视图文件,并在模型中将get_image_url定义为实例方法。