如何在Rake任务中修复“未初始化常量”错误

32

当我执行以下操作时,遇到了问题:

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表的信息。

为什么第二个失败了而第一个没有?是否存在参数作用域?

5个回答

81

我不确定为什么两种方式都可以,但如果这是Rails并且那些是Rails模型,你的tasks应该依赖于环境:

task :get_roles => [ :environment ] do

通过依赖于:environment任务,首先会加载Rails。

另请参见:在Rake中什么是“environment”任务?.


显然,它使用Rails框架,并且我认为它加载默认环境。无论是开发还是生产环境或其他任何环境,都会试着依据你回答的投票情况来尝试你所说的方法。 - SeekingTruth
1
你也不能使用你的“示例”来执行任务 :something => [:enviroment], [:param] do |t, args| ... end,你能澄清一下我如何传递参数吗? - SeekingTruth
2
尝试 :something, [:param] => [:environment] - DGM

12

你也可以这样运行 Rake 任务:

bundle exec rake environment xaaron:get_role

这将首先加载Rails环境。


这是对我有效的方法。不确定为什么你被踩了。 - coisnepe
没错,@coisnepe。值得一加。 :) - Marcos Serpa
3
你是字面上输入“环境”这个词吗?还是应该替换它?例如:bundle exec rake production xaaron:get_role - BenKoshy

1

即使我依赖于:environment并使用bundle exec运行,但我仍然会在Rake任务中遇到未初始化常量错误。

问题在于我正在创建一个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

0
config.autoload_paths += %W(#{config.root}/lib) 在application.rb中对我有效

回答不是为了表示感谢而存在的。一旦你获得足够的声望,你就可以留下评论。 - ShadowCrafter_01
1
@ShadowCrafter_01:对我来说,这个回答感谢的是什么并不清楚。看起来这是一个新的回答。 - Jeremy Caney

0

此外,在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接