12

我正在尝试向我的seeds.rb添加一个方法,这样我就不必编写一堆冗长的代码。但是,根据create_deliverable方法的位置,我在运行时会收到两条错误消息之一db:setup

当方法在调用之前

耙中止!调用私有方法“create_deliverable”#

当方法在调用之后

耙中止!# 未定义的方法“create_deliverable”

不能在seed.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
4

3 回答 3

18

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

def test_method
  puts "Hello!"
end

test_method
于 2015-07-23T01:32:54.650 回答
15

如果要使用self.,请在方法定义上使用它,而不是在调用上。

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

我的理解是,.rb没有类定义的文件在运行时会被包装在匿名 ruby​​ 类中,因此在 self 上定义方法应该可以正常工作。

于 2009-11-17T18:17:07.273 回答
7

在我看来,您将create_deliverable方法放在private脚本中的访问修饰符之后。放在后面public

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
于 2009-11-17T18:19:14.510 回答