2009-11-17 53 views
9

我想向我的seeds.rb添加一个方法,这样我就不必编写一堆冗长的代码。但是,根据create_deliverable方法的位置,运行db:setup时会出现两条错误消息之一。在Ruby On Rails的seeds.rb中使用方法

当方法调用之前

耙中止! 私有方法 '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没有定义任何类,所以公共和私人无关紧要。重要的是您在执行该方法之前先定义该方法。 – 2017-08-17 15:48:08

12

如果你打算使用self.,使用它的方法定义,而不是打电话。

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

这是我的理解是.rb文件,而一个类定义得到包裹在一个匿名的Ruby类它们运行时,这样定义自我的方法应该只是罚款。

+5

+1有关如何'.rb'文件,而一个类定义得到包裹在一个匿名Ruby类的解释 – ahsteele 2009-11-17 18:48:31

+0

欢迎您。 :) – localshred 2009-11-19 05:32:20

10

请确保在调用它之前定义的方法:

def test_method 
    puts "Hello!" 
end 

test_method 
+2

这实际上是一个更好的答案,因为seeds.rb没有定义类,所以public/private方法并不重要。 – 2017-08-17 15:47:19