Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails NoMethodError:未定义的方法`methodname';对于#<;内存位置>;_Ruby On Rails_Ruby_Ruby On Rails 3.1 - Fatal编程技术网

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之外构建服务层或模型抽象更为明智。