我想我明白为什么会这样,但我不知道如何解决这个问题。
我将在下面发布相关代码。
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;方法。
知道如何解决这个问题吗?
答案 0 :(得分:3)
首先,您在CoverageController
中定义方法,而不是Coverage
其次,您定义了一个实例方法,因此该方法仅对该类的实例有效。你可以这样称呼它:
coverages_controller = CoveragesController.new
coverages_controller.grab
答案 1 :(得分:3)
Coverage
和CoverageController
不是一回事。您已将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