NoMethodError: неопределенный метод `methodname 'для # - PullRequest
2 голосов
/ 17 января 2012

Мне кажется, я понимаю, почему это происходит, но я не уверен, как решить проблему.

Я опубликую соответствующий код ниже.

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

То, что делает метод захвата, не так важно.Это просто метод, который использует несколько других методов для подсчета количества раз, когда «Обама» упоминался на веб-сайте 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, для меня, чтобы запустить метод "захватить".

Есть идеи, как решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 17 января 2012

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 - это сам класс, а не экземпляр класса, и нет метода класса grab.

Как правило, вы не будете вызывать методы непосредственно на контроллерах - вы оставляете это на усмотрение маршрутизатора. Вы можете попробовать создать экземпляр CoverageController, например ::1010

>> @cc = CoverageController.new ...
>> @cc.grab

Но это не удастся, если вы не предоставите ту же среду и параметры, что и у маршрутизатора.

3 голосов
/ 17 января 2012

Сначала вы определяете свой метод в CoverageController, а не в Coverage Во-вторых, вы определяете метод экземпляра, который, таким образом, действителен только для экземпляра класса.Вы можете назвать это так:

coverages_controller = CoveragesController.new
coverages_controller.grab
2 голосов
/ 17 января 2012

Вы определили метод grab как метод экземпляра в CoveragesController, а затем попытались вызвать его как метод класса в классе Coverages.

Что вам нужно сделать, это определить его как метод класса в классе Coverages.

class Coverages
  def self.grab
    # ...
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...