0

我尝试将我的脚本放在从我的模型继承的类中,如下所示:

class ScriptName < MyModel

但是当我rake my_script在命令行运行时,我得到了这个错误:

rake aborted!
uninitialized constant MyModel

我究竟做错了什么?

另外,我应该命名我的文件my_script.rb还是my_script.rake

4

2 回答 2

2

只需要文件。我在我的一项 rake 任务(我命名my_script.rake)中执行此操作

require "#{Rails.root.to_s}/app/models/my_model.rb"

这是一个完整的例子

# lib/tasks/my_script.rake

require "#{Rails.root.to_s}/app/models/video.rb"

class Vid2 < Video
  def self.say_hello
    "Hello I am vid2"
  end
end

namespace :stuff do
  desc "hello"
  task :hello => :environment do
    puts "saying hello..."
    puts Vid2.say_hello
    puts "Finished!"
  end
end

但更好的设计是让 rake 任务简单地调用一个辅助方法。好处是更容易扫描可用的 rake 任务,更容易调试,并且 rake 任务运行的代码变得非常可测试。例如,您可以添加一个rake_helper_spec.rb文件。

# /lib/rake_helper.rb
class Vid2 < Video
  def self.say_hello
    "Hello I am vid2"
  end
end

# lib/tasks/myscript.rake
namespace :stuff do
  desc "hello"
  task :hello => :environment do
    Vid2.say_hello
  end
end
于 2012-06-03T00:30:27.657 回答
0

我要做的就是把我的要求放在任务规范之上,然后:environment像这样声明标志:

task :my_script => :environment do
 #some code here
end

仅仅通过这样做,我就可以访问我所有的模型。我不需要,require 'active_record'甚至require我的模型。

只需指定环境,我的所有模型都可以访问。

我也遇到了 Nokogiri 的问题,我所做的只是将它从文件顶部删除为 arequire并将其添加到我的 Gemfile 中。

于 2012-06-03T03:43:31.877 回答