为什么我得到一个未初始化的常量rake任务,Rails 4.1.8

时间:2014-12-11 20:09:36

标签: ruby-on-rails ruby ruby-on-rails-4 rake rake-task

我有这个奇怪的问题,如果我这样做:

  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_rolesbin/rake xaaron:get_role

为什么第二个爆炸但第一个爆炸?是否存在争论的事情?

更新

我应该注意,我可以在使用所述引擎的主应用中执行bin/rails c并执行Xaaron::Role并获取有关角色表的信息。

3 个答案:

答案 0 :(得分:39)

我不确定为什么会这样,但如果这是rails并且那些是rails模型,那么你的任务应该取决于环境:

task :get_roles => [ :environment ] do

依赖于:environment任务,它首先加载rails。

另见:

What's the 'environment' task in Rake?

答案 1 :(得分:3)

您还可以将rake任务作为

运行
local_source = if system('curl -s https://local-gems.example.com > /dev/null') != false
  # `curl` not available (`nil` returned) 
  #  or local gem server accessible (`true` returned) 
  #  try accessing:
  'https://local-gems.example.com'
else
  # Fall back on default behaviour
  'https://rubygems.org'
end

source local_source do
  gem 'local-gem'
end

这将首先加载Rails环境。

答案 2 :(得分: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

OR

bundle exec rake xaaron:get_roles

仅此而已。

我希望这会有所帮助