我正在尝试创建自定义 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)
有任何想法吗?谢谢
想通了,任务应该是这样的:
namespace :test do
task :new_task => :environment do
puts Parent.all.inspect
end
end
请注意添加到任务的 => :environment
依赖项
你可能需要你的配置(应该指定所有你需要的模型等)
例如:
require 'config/environment'
或者,您可以单独要求每个,但您可能会遇到环境问题 AR 未设置等)
当您开始编写您的 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 之间有所不同。)
environment
作为依赖项是必需的,然后说语法而不是鼓励 OP 依赖甚至不使用任何魔法的“魔法”实用程序吗?
使用新的 ruby 哈希语法(Ruby 1.9),环境将像这样添加到 rake 任务中:
namespace :test do
task new_task: :environment do
puts Parent.all.inspect
end
end
使用以下命令生成任务(带有任务名称的命名空间):
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
:environment 依赖关系被正确地调用了,但是 rake 仍然可能不知道你的模型依赖的其他 gem - 在我的一个例子中,'protected_attributes'。
答案是运行:
bundle exec rake test:new_task
这保证了环境包含您的 Gemfile 中指定的任何 gem。
new_task
分配给当前环境?:environment
的当前值是多少?谷歌没有帮助。new_task
时,首先加载环境(加载你的模型),然后运行 new_task。