2017-02-14 3 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

Вы не можете позвонить частным методам с явным приемником. Поэтому либо сделайте это общедоступным, либо используйте , либо позвоните по телефону еще один метод на Ad, который назовет это.

+0

Как насчет защищенного? – Tom

+0

То же самое, в этом случае. –

0

В консоли вы можете использовать метод отправки для проверки личных методов. Поэтому 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

Нет, этот код не сработает по той же причине. –

Смежные вопросы