Ruby:循环依赖自动加载

时间:2016-06-13 17:42:35

标签: ruby-on-rails ruby vmware autoload theforeman

我正在尝试修补一个foreman bug,它们在构建后不会禁用网络启动,并在您想要重建主机时将其重新打开。看起来我只需要在"内置"中添加一些代码。方法:

./应用程序/控制器/ unattended_controller.rb

def built
    logger.info "#{controller_name}: #{@host.name} is Built!"
    update_ip if Setting[:update_ip_from_built_request]
    head(@host.built ? :created : :conflict)
 end

和" setBuild"方法:

./应用/模型/主机/ managed.rb

def setBuild
  self.build = true
  self.save
  errors.empty?
end

借用foreman_bootdisk.rb第79行和modify_vm_cdrom.rb获取灵感,  我想出了一些基本的内容:

def setBuild
  load '/usr/share/foreman/app/models/compute_resources/foreman/model/vmware.rb'
  if ComputeResources::Foreman::Model::Vmware.available?
      vm_reconfig_hardware('instance_uuid' => params[:token], 'hardware_spec' => {'bootOptions'=>['network', 'disk']})
  end
  self.build = true
  self.save
  errors.empty?
end

问题是我收到了错误,

  

哎呀,我们很抱歉但出了点问题自动加载常量ComputeResources :: Foreman :: Model :: Vmware

时检测到循环依赖

我已经对此做了一些阅读,并听说问题可能是有轨道自动加载,但我已经尝试用加载和要求修复此问题(我试图避免我听到的自动加载功能{{ 3}}),但尽管尝试了两者,我仍然会遇到这个错误,我不确定为什么。我做什么的不同于foreman_bootdisk.rb的编码器来获得这个错误他们不是?乳清似乎没有deprecated想加载吗?

2 个答案:

答案 0 :(得分:1)

def setBuild
  vm_reconfig_hardware(
    'instance_uuid' => params[:token],
    'hardware_spec' => {'bootOptions'=>['network', 'disk']}
  ) if Fog::Compute.providers.include?(:vsphere)

  self.build = true
  self.save
  errors.empty?
end

答案 1 :(得分:0)

我认为您的问题是由不正确的常量名称引起的。你尝试过这样的事吗?

def setBuild
  if Foreman::Model::Vmware.available?
    vm_reconfig_hardware('instance_uuid' => params[:token], 'hardware_spec' => {'bootOptions'=>['network', 'disk']})
  end
  self.build = true
  self.save
  errors.empty?
end

在Foreman源代码中没有常量的ComputeResources(最后有s),但是当你尝试在rails控制台中使用它时它会起作用。这是因为rails自动加载是一种动态创建模块,因为存在名为compute_resources的目录。