NoMethodError:#<memory location =“”> </memory>的未定义方法`methodname'

时间:2012-01-16 21:25:00

标签: ruby-on-rails ruby ruby-on-rails-3.1

我想我明白为什么会这样,但我不知道如何解决这个问题。

我将在下面发布相关代码。

class CoveragesController < ApplicationController
  def grab
    url = { 
      "cnn" => "http://www.cnn.com/", 
      "cnn_politics" => "http://www.cnn.com/POLITICS/",
    }

    url.each do |key, value|
      data = urlToString(value)
      appearances = countAppearances(data)
      @coverage = Coverage.create(
        :media        => key,
        :url          => value,
        :content      => data,
        :obama        => appearances["obama"],   
      )
    end
  end
end

什么抓取方法不重要。它只是一种方法,使用多种其他方法来计算时间的数量&#34;奥巴马&#34; CNN网站已经提到过。

在rails控制台中,我尝试运行Coverage.grab。这是我收到的错误信息。

1.9.3-p0 :003 > Coverage.grab
NoMethodError: undefined method `grab' for #<Class:0x007f9a5d813bf8>
    from /Users/jasonkim/.rvm/gems/ruby-1.9.3-p0/gems/activerecord-3.1.3/lib/active_record/base.rb:1088:in `method_missing'
    from (irb):3
    from /Users/jasonkim/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands/console.rb:45:in `start'
    from /Users/jasonkim/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands/console.rb:8:in `start'
    from /Users/jasonkim/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands.rb:40:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

Coverage.new顺便提一下。

另外,当我配置route.rb,并创建一个运行抓取方法的地址时,它也运行良好。

我猜测当我运行Coverage.grab时,我不会在任何Coverage实例中运行&#34;抓住&#34;方法。

知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

首先,您在CoverageController中定义方法,而不是Coverage 其次,您定义了一个实例方法,因此该方法仅对该类的实例有效。你可以这样称呼它:

coverages_controller = CoveragesController.new
coverages_controller.grab

答案 1 :(得分:3)

CoverageCoverageController不是一回事。您已将grab定义为类CoverageController上的实例方法,但您尝试调用类Coverage.grab上的类方法Coverage

如果您希望能够拨打Coverage.grab,您可以这样定义:

class Coverage < ActiveRecord::Base
  def self.grab
    puts "foo"
  end
end

# Usage
>> Coverage.grab
=> foo

但是,如果您希望grab成为CoverageController中的某个操作,那么您已正确定义了该操作。但它是一个实例方法,而不是类方法 - 你不能调用CoverageController.grab,因为CoverageController是类本身,而不是类的实例,并且没有类方法{{1} }。

通常,您不会直接在控制器上调用方法 - 将其留给路由器。您可以尝试实例化CoverageController的实例,例如:

grab

但除非你提供与路由器相同的环境和参数,否则这将失败。

答案 2 :(得分:2)

您将grab方法定义为CoveragesController上的实例方法,然后尝试将其称为Coverages类的类方法。

您需要做的是将其定义为Coverages类的类方法。

class Coverages
  def self.grab
    # ...
  end
end