【问题标题】:undefined method rails -- calling a controller method from viewundefined method rails -- 从视图中调用控制器方法
【发布时间】:2014-04-06 07:42:43
【问题描述】:

错误是未定义项目的方法“get_image_url”,即使在声明了辅助方法之后也是如此。

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

这是模型方法

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

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

【问题讨论】:

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


    【解决方案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 模型的初始化版本,所以您可以在其上使用实例方法没有问题:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        相关资源
        最近更新 更多