0

次のように、モデルから継承したクラスにスクリプトを入れてみました。

class ScriptName < MyModel

しかしrake my_script、コマンドラインで実行すると、次のエラーが発生しました。

rake aborted!
uninitialized constant MyModel

私は何を間違っていますか?

また、ファイルに名前を付ける必要がありますmy_script.rbmy_script.rake?

4

2 に答える 2

2

ファイルを要求するだけです。これは、rake タスクの 1 つ (名前は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にも問題がありました。ファイルの先頭から削除requireし、Gemfile に追加しただけです。

于 2012-06-03T03:43:31.877 に答える