【问题标题】:How to fix "uninitialized constant" in a Rake taskRails:为什么我在 rake 任务中得到未初始化的常量,Rails 4.1.8
【发布时间】:2015-02-10 10:47:01
【问题描述】:

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

  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 并获取有关角色表的信息。

【问题讨论】:

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


    【解决方案1】:

    我不确定为什么两者都有效,但如果这是 rails 而那些是 rails 模型,您的任务应该取决于环境:

    task :get_roles => [ :environment ] do
    

    根据 :environment 任务,它首先加载 rails。

    另见:

    What's the 'environment' task in Rake?

    【讨论】:

    • 显然它会运行,我认为它会加载默认环境。无论是开发、生产还是其他任何事情。但是,我会根据您对答案的投票来尝试您所说的话。
    • 你也不能用你的“例子”做任务:something => [:enviroment], [:param] do |t, args| ... end你能澄清我如何传递参数吗?
    • 试试:something, [:param] => [:environment]
    【解决方案2】:

    你也可以运行 rake 任务

    bundle exec rake environment xaaron:get_role
    

    这将首先加载 Rails 环境。

    【讨论】:

    • 这对我有用。不知道你为什么被否决
    • 是的,@coisnepe。值得1+。 :)
    • 您是按字面意思输入“环境”这个词还是要替换它。例如:bundle exec rake production xaaron:get_role
    【解决方案3】:

    要添加,从 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
    

    就是这样。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多