2017-02-14 64 views
2

我正在尝试使用Rails控制台遍历所有Ad模型。我想每个广告进行所谓extract_targets的私有方法:Rails NoMethodError:私有方法上的私有方法?

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 
+0

私有方法只能从类 –

+0

@DeepakMahakale内部调用:即使如此,并非总是如此。 –

回答

2

您无法使用显式接收方调用私有方法。所以要么公开,要么使用send,要么拨打另一个方法在Ad上调用这个方法。

+0

保护措施怎么样? – Tom

+0

同样的事情,在这种情况下。 –

0

在控制台中,您可以使用send方法来检查私有方法。所以ad.send(:extract_targets)应该工作。

+0

在这种情况下,私密性有什么意义?不妨将其公开化。 –

+0

他只是在控制台中测试它。它不会是实际应用程序的一部分。用户无法调用.send任何东西。但是如果你需要在控制台中测试/捅一些私人信息(对于其他字词),.send非常方便。 – aspencer8111

+0

对我来说,它看起来非常像实际应用程序的一部分。 –

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 
+0

不,这个代码不起作用,原因完全一样。 –