Ruby on rails NoMethodError:未定义的方法`methodname';对于#<;内存位置>;
我想我理解为什么会发生这种情况,但我不知道如何解决这个问题 我将在下面发布相关代码Ruby on rails NoMethodError:未定义的方法`methodname';对于#<;内存位置>;,ruby-on-rails,ruby,ruby-on-rails-3.1,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, v
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
class CoveragesController“http://www.cnn.com/",
“cnn_政治”=>“http://www.cnn.com/POLITICS/",
}
url.do |每个键、值|
数据=urlToString(值)
外观=计数外观(数据)
@coverage=coverage.create(
:media=>key,
:url=>值,
:content=>数据,
:obama=>露面[“obama”],
)
结束
结束
结束
抓取方法的作用并不重要。这是一种简单的方法,它使用多种其他方法来计算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>'
1.9.3-p0:003>Coverage.grab
NoMethodError:未定义的方法“grab”#
from/Users/jasonkim/.rvm/gems/ruby-1.9.3-p0/gems/activerecord-3.1.3/lib/active\u record/base.rb:1088:in'method\u missing'
来自(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'
来自/Users/jasonkim/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands/console.rb:8:in'start'
来自/Users/jasonkim/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands.rb:40:in`'
来自脚本/rails:6:in'require'
来自脚本/rails:6:in`'
覆盖范围。顺便说一句,新的作品还不错
另外,当我配置route.rb并创建一个运行grab方法的地址时,它也可以正常运行
我猜当我运行Coverage.grab时,其中没有任何Coverage实例,我可以运行“grab”方法
知道我如何解决这个问题吗?首先,您在
Coverage controller
中定义方法,而不是在Coverage
其次,您定义了一个实例方法,因此该方法仅对类的实例有效。你可以这样称呼它:
coverages_controller = CoveragesController.new
coverages_controller.grab
class Coverage < ActiveRecord::Base
def self.grab
puts "foo"
end
end
# Usage
>> Coverage.grab
=> foo
Coverage
和Coverage控制器
不是一回事。您已将grab
定义为类CoverageController
上的实例方法,但尝试调用Coverage.grab
,它是类Coverage
上的类方法
如果您希望能够调用Coverage.grab,您可以这样定义它:
coverages_controller = CoveragesController.new
coverages_controller.grab
class Coverage < ActiveRecord::Base
def self.grab
puts "foo"
end
end
# Usage
>> Coverage.grab
=> foo
但是,除非您提供与路由器相同的环境和参数,否则此操作将失败。您将grab
方法定义为CoveragesController
上的实例方法,然后尝试将其作为Coverages
类上的类方法调用
class Coverages
def self.grab
# ...
end
end
您需要做的是将其定义为Coverages
类上的类方法
class Coverages
def self.grab
# ...
end
end
谢谢霍尔格和其他人。尽管Jordan和clyfe的回答是正确的,但在Rails的上下文中,Holger的建议似乎效果最好。Rails控制器不是要通过框架来实例化的,这样做对imho来说是一件坏事。如果您想在控制器中使用grab方法,最多可以将其移动到ApplicationController(并通过继承调用),但最好将其放在自己的RemoteRequest类或类似类中,最有可能是一个类方法。@clyfe一般来说,您是对的。Rails控制器最好只由Rails路由器调用。但总有例外。例如,当您使用服务层时(并且不太重视名称层),那么直接实例化和调用控制器方法可能是有意义的。尽管您必须确保不使用环境信息,如params
hash或sessions。因此,在大多数情况下,在通常的ActiveRecord/ActionPack之外构建服务层或模型抽象更为明智。