245

我正在尝试创建自定义 rake 任务,但似乎我无权访问我的模型。我认为这是 rails 任务中隐含的内容。

我在 lib/tasks/test.rake 中有以下代码:

namespace :test do
  task :new_task do
    puts Parent.all.inspect
  end
end

这是我的父模型的样子:

class Parent < ActiveRecord::Base
  has_many :children
end

这是一个非常简单的示例,但我收到以下错误:

/> rake test:new_task
(in /Users/arash/Documents/dev/soft_deletes)
rake aborted!
uninitialized constant Parent

(See full trace by running task with --trace)

有任何想法吗?谢谢

4

6 回答 6

429

想通了,任务应该是这样的:

namespace :test do
  task :new_task => :environment do
    puts Parent.all.inspect
  end
end

注意 => :environment添加到任务的依赖项

于 2009-05-18T05:47:09.907 回答
17

你可能需要你的配置(应该指定所有你需要的模型等)

例如:

require 'config/environment'

或者,您可以单独要求每个,但您可能会遇到环境问题 AR 未设置等)

于 2009-05-18T05:45:19.767 回答
14

当您开始编写您的rake任务时,请使用生成器为您生成它们。

例如:

rails g task my_tasks task_one task_two task_three 

您将获得一个在 lib/tasks 中创建的存根,称为my_tasks.rake(显然使用您自己的命名空间。)它看起来像这样:

namespace :my_tasks do

  desc "TODO"
  task :task_one => :environment do 
  end  

  desc "TODO"
  task :task_two => :environment do 
  end  

  desc "TODO"
  task :task_three => :environment do 
  end  

end

您的所有 Rails 模型等都将在每个任务块内用于当前环境,除非您使用的是生产环境,在这种情况下,您需要需要您想要使用的特定模型。在任务主体内执行此操作。(IIRC 这在不同版本的 Rails 之间有所不同。)

于 2013-08-29T06:56:51.133 回答
6

使用新的 ruby​​ 哈希语法(Ruby 1.9),环境将像这样添加到 rake 任务中:

namespace :test do
  task new_task: :environment do
    puts Parent.all.inspect
  end
end
于 2018-06-14T21:30:06.087 回答
4

使用以下命令生成任务(带有任务名称的命名空间):

rails g task test new_task

使用以下语法添加逻辑:

namespace :test do
  desc 'Test new task'
  task new_task: :environment do
    puts Parent.all.inspect
  end
end

使用以下命令运行上述任务:

bundle exec rake test:new_task  

或者

 rake test:new_task
于 2018-12-28T14:06:31.673 回答
2

:environment 依赖关系被正确地调用了,但是 rake 仍然可能不知道你的模型依赖的其他 gem - 在我的一个例子中,'protected_attributes'。

答案是运行:

bundle exec rake test:new_task

这保证了环境包含您的 Gemfile 中指定的任何 gem。

于 2016-07-05T00:13:50.873 回答