Rails NoMethodError:私有方法的私有方法?

时间:2017-02-14 13:53:29

标签: ruby-on-rails ruby

我正在尝试使用Rails控制台迭代所有Ad模型。我希望每个广告都执行名为extract_targets的私有方法:

Ad.all.each do |ad|
  ad.extract_targets
end

虽然在循环时遇到以下错误:

NoMethodError: private method `extract_targets' called for #<Ad:0x000000071123b0>

这是一种私有方法,但我是从每个广告中调用它,所以我不知道它为什么会引发异常?

  private

  def extract_targets
    normal_name = campaign.name.sub(/^www\./, '')
    links = page.css('a').map { |link| URI(link['href']) }.select {|link|     link.host.sub(/^www\./, '').end_with? normal_name }
    location = links.first.path
    location = '/' if location.empty?
    location.normalize_path!
    update_column :target_id, campaign.targets.find_or_create_by(location: location).id
  end  

3 个答案:

答案 0 :(得分:2)

您无法使用显式接收器调用私有方法。因此,要么将其公开,要么使用var path = document.querySelectorAll('svg path'); Velocity(path[0], { tween: 1000 }, { duration: 6000, easing: 'easeOutBounce', progress: function (el, c, r, s, t) { el[0].setAttribute('d', ??????); } }); ,或在send上调用另一个方法来调用此方法。

答案 1 :(得分:0)

在控制台中,您可以使用send方法检查私有方法。所以Ad应该有用。

答案 2 :(得分:0)

一种方法是在模型上编写一个类方法。

<强> ad.rb

class Ad < ActiveRecord::Base
  ...

  def self.extract_all_targets
    all.each do |ad|
      ad.extract_targets
    end
  end

  private

  def extract_targets
    ...
  end
end

然后在你的控制台中使用它:

Ad.extract_all_targets