在Ruby On Rails中使用seeds.rb中的方法

ahs*_*ele 12 ruby-on-rails seed

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

方法在调用之前

耙子流产了!私有方法'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
Run Code Online (Sandbox Code Playgroud)

致电代码

@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
Run Code Online (Sandbox Code Playgroud)

loc*_*red 15

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

def self.create_deliverable(...)
    ...
end
...
create_deliverable("Low", type.id, phase.id)
...
Run Code Online (Sandbox Code Playgroud)

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

  • 关于如何将没有类定义的`.rb`文件包装在匿名ruby类中的解释+1 (7认同)

Joe*_*ski 11

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

def test_method
  puts "Hello!"
end

test_method
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是一个更好的答案,因为seeds.rb没有定义类,所以公共/私有方法无关紧要. (2认同)

Ale*_*sky 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
Run Code Online (Sandbox Code Playgroud)

  • seed.rb 没有定义任何类,所以 public 和 private 并不重要。重要的是您在执行之前定义方法。 (2认同)