ruby 如何修复Rake任务中的“未初始化常量”

ercv8c1e  于 2023-06-22  发布在  Ruby
关注(0)|答案(5)|浏览(169)

我有一个问题,当我这样做:

namespace :xaaron do
  task :get_roles do
    roles = Xaaron::Role.all
    puts roles
  end
  
  task :get_role, [:name] do |t, args|
    role = Xaaron::Role.find(args[:name].parameterize)
    puts role
  end
end

第一个任务会很好。我甚至可以添加binding.pry并运行Xaaron::Role并获取有关角色的信息。但是第二个任务失败了:

NameError: uninitialized constant Xaaron::Role

我在我的主应用程序中运行每个任务,因为这些任务都在一个引擎中,使用:

bin/rake xaaron:get_roles` and `bin/rake xaaron:get_role

我可以在使用该引擎的主应用程序中运行bin/rails c,然后运行Xaaron::Role并获取有关Roles表的信息。
为什么第二个失败了,而第一个没有?是否有参数的作用域?

w46czmvw

w46czmvw1#

我不知道为什么这两种方法都有效,但是如果这是Rails,而那些是Rails模型,那么你的任务应该取决于环境:

task :get_roles => [ :environment ] do

根据:environment任务,它首先加载Rails。
参见:What's the 'environment' task in Rake?

kdfy810k

kdfy810k2#

您也可以运行Rake任务

bundle exec rake environment xaaron:get_role

这将首先加载Rails环境。

7d7tgy0s

7d7tgy0s3#

我一直得到一个Rake任务的未初始化的常量错误,即使在依赖于:environment并使用bundle exec运行之后也是如此。
问题是,我正在创建一个Rake::TestTask,尽管Rake任务可以访问所有常量,但测试文件本身无法访问常量。
解决方案是将这一行添加到我的测试文件的顶部:

require_relative '../config/environment'

这是Rake任务:

require "rake/testtask"

Rake::TestTask.new(:test) do |t|
  t.libs << "test"
  t.libs << "lib"
  t.test_files = FileList["test/**/test_*.rb"]
end
7lrncoxx

7lrncoxx4#

要添加,从Ruby 1.9及以上版本开始,您可以使用以下哈希语法:

namespace :xaaron do
  desc "Rake task to get roles"
  task get_roles: :environment do
    roles = Xaaron::Role.all
    puts roles
  end
  #####

end

然后你可以运行下面的命令来运行Rake任务:

rake xaaron:get_roles

bundle exec rake xaaron:get_roles
hlswsv35

hlswsv355#

config.autoload_paths += %W(#{config.root}/lib)
在application.rb中为我工作

相关问题