Ich versuche, eine benutzerdefinierte Rake-Aufgabe zu erstellen, aber es scheint, dass ich keinen Zugriff auf meine Modelle habe. Ich dachte, dies sei etwas implizites in der Rails-Aufgabe.
Ich habe den folgenden Code in lib/task/test.rake:
namespace :test do
task :new_task do
puts Parent.all.inspect
end
end
Und so sieht mein Elternmodell aus:
class Parent < ActiveRecord::Base
has_many :children
end
Es ist ein ziemlich einfaches Beispiel, aber ich erhalte die folgende Fehlermeldung:
/> rake test:new_task
(in /Users/arash/Documents/dev/soft_deletes)
rake aborted!
uninitialized constant Parent
(See full trace by running task with --trace)
Irgendwelche Ideen? Vielen Dank
Um es herauszufinden, sollte die Aufgabe so aussehen:
namespace :test do
task :new_task => :environment do
puts Parent.all.inspect
end
end
Beachten Sie die => :environment
-Abhängigkeit, die der Aufgabe hinzugefügt wurde
möglicherweise müssen Sie Ihre Konfiguration anfordern (die alle erforderlichen Modelle usw. angeben muss).
z.B:
require 'config/environment'
alternativ können Sie jedes nur einzeln anfordern, aber Sie haben möglicherweise Umgebungsprobleme, die nicht eingerichtet sind.
Wenn Sie mit dem Schreiben Ihrer rake - Aufgaben beginnen, verwenden Sie einen Generator, um sie für Sie auszulagern.
Zum Beispiel:
Rails g task my_tasks task_one task_two task_three
Sie erhalten einen in lib/task erstellten Stub mit dem Namen my_tasks.rake
(verwenden Sie offensichtlich Ihren eigenen Namespace.)
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
Alle Ihre Rails-Modelle usw. sind für die aktuelle Umgebung in jedem Taskblock verfügbar, sofern Sie nicht die production -Umgebung verwenden. In diesem Fall müssen Sie die spezifischen Modelle benötigen, die Sie verwenden möchten. Tun Sie dies innerhalb des Körpers der Aufgabe. (IIRC variiert zwischen den verschiedenen Rails-Versionen.)
Die Abhängigkeit von der Umgebung ist ziemlich korrekt, aber der Rake kennt möglicherweise noch keine Informationen über andere Edelsteine, von denen Ihre Modelle abhängen - in einem meiner Fälle 'protected_attributes'.
Die Antwort lautet:
bundle exec rake test:new_task
Dies garantiert, dass die Umgebung alle in Ihrer Gemfile angegebenen Edelsteine enthält.
Mit der neuen Ruby-Hash-Syntax (Ruby 1.9) wird die Umgebung der Rake-Task wie folgt hinzugefügt:
namespace :test do
task new_task: :environment do
puts Parent.all.inspect
end
end
Task generieren mit folgendem Befehl (Namespace mit Taskname):
Rails g task test new_task
Verwenden Sie die folgende Syntax, um Logik hinzuzufügen:
namespace :test do
desc 'Test new task'
task new_task: :environment do
puts Parent.all.inspect
end
end
Führen Sie die obige Aufgabe mit dem folgenden Befehl aus:
bundle exec rake test:new_task
oder
rake test:new_task