次のように、モデルから継承したクラスにスクリプトを入れてみました。
class ScriptName < MyModel
しかしrake my_script
、コマンドラインで実行すると、次のエラーが発生しました。
rake aborted!
uninitialized constant MyModel
私は何を間違っていますか?
また、ファイルに名前を付ける必要がありますmy_script.rb
かmy_script.rake
?
次のように、モデルから継承したクラスにスクリプトを入れてみました。
class ScriptName < MyModel
しかしrake my_script
、コマンドラインで実行すると、次のエラーが発生しました。
rake aborted!
uninitialized constant MyModel
私は何を間違っていますか?
また、ファイルに名前を付ける必要がありますmy_script.rb
かmy_script.rake
?
ファイルを要求するだけです。これは、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
これを機能させるために私がしなければならなかったのは、私の要件をタスク仕様の上に置き、次の:environment
ようにフラグを宣言することだけでした:
task :my_script => :environment do
#some code here
end
それだけで、すべてのモデルにアクセスできるようになりました。require 'active_record'
私は自分require
のモデルを必要としませんでした。
環境を指定するだけで、すべてのモデルにアクセスできました。
Nokogiriにも問題がありました。ファイルの先頭から削除require
し、Gemfile に追加しただけです。