2009-11-17 3 views
9

Я пытаюсь добавить метод к моему seeds.rb, так что мне не нужно писать кучу подробного кода. Однако в зависимости от размещения метода create_deliverable я получаю одно из двух сообщений об ошибке при запуске db:setup.Использование метода в seeds.rb в Ruby On Rails

Когда метод перед вызовом

рейка прервана! частный метод 'create_deliverable' призвал #

Когда метод после вызова

грабли прервана! неопределенный метод `create_deliverable» для #

Разве это не возможно использует методы в seeds.rb? Я как-то неправильно нахожу метод (я пробовал звонить с и без self.)?

Метод

def create_deliverable(complexity, project_phase_id, deliverable_type_id) 
    Deliverable.create(:name => (0...8).map{65.+(rand(25)).chr}.join, 
     :size => 2 + rand(6) + rand(6), 
     :rate => 2 + rand(6) + rand(6), 
     :deliverable_type_id => deliverable_type_id, 
     :project_phase_id => project_phase_id, 
     :complexity => complexity) 
end 

телефонный код

@wf_project.project_phases.each do |phase| 
    DeliverableType.find_by_lifecycle_phase(phase.lifecycle_phase_id).each do 
    |type| 
    self.create_deliverable("Low", type.id, phase.id) 

    self.create_deliverable("Medium", type.id, phase.id) 

    self.create_deliverable("High", type.id, phase.id) 
    end 
end 

ответ

5

Похоже, вы разместили свой метод create_deliverable после «частного» модификатора доступа в вашем скрипте. Положите это после публики.

public 

    def create_deliverable(complexity, project_phase_id, deliverable_type_id) 
     Deliverable.create(:name => (0...8).map{65.+(rand(25)).chr}.join, 
      :size => 2 + rand(6) + rand(6), 
      :rate => 2 + rand(6) + rand(6), 
      :deliverable_type_id => deliverable_type_id, 
      :project_phase_id => project_phase_id, 
      :complexity => complexity) 
    end 
private # to keep the rest of methods private 
+0

seeds.rb не определяет классы, поэтому публичные и частные не имеют значения. Важно то, что вы определяете метод перед его исполнением. –

12

Если вы собираетесь использовать self., использовать его на определение метода, а не вызов.

def self.create_deliverable(...) 
    ... 
end 
... 
create_deliverable("Low", type.id, phase.id) 
... 

Это мое понимание того, что .rb файлов без определения класса получить завернутые в анонимном классе рубина, когда они работают, так что определение метода на себя должны работать нормально.

+5

+1 для объяснения о том, как '.rb' файлы без определения класса получить завернутые в анонимном классе рубинового – ahsteele

+0

Вы можете , :) – localshred

10

Убедитесь, что вы определить метод перед вызовом:

def test_method 
    puts "Hello!" 
end 

test_method 
+2

Это на самом деле лучший ответ, потому что seeds.rb не определяет класс, поэтому общедоступные/частные методы не имеют значения. –