Czy zadania prowizji dotyczące szyn zapewniają dostęp do modeli ActiveRecord?

235

Próbuję utworzyć niestandardowe zadanie rake, ale wygląda na to, że nie mam dostępu do moich modeli. Myślałem, że było to coś domyślnie uwzględnionego w zadaniu dotyczącym szyn.

Mam następujący kod w lib / task / test.rake:

namespace :test do
  task :new_task do
    puts Parent.all.inspect
  end
end

A oto jak wygląda mój model nadrzędny:

class Parent < ActiveRecord::Base
  has_many :children
end

To dość prosty przykład, ale pojawia się następujący błąd:

/> rake test:new_task
(in /Users/arash/Documents/dev/soft_deletes)
rake aborted!
uninitialized constant Parent

(See full trace by running task with --trace)

Jakieś pomysły? Dzięki

gmoniey
źródło

Odpowiedzi:

410

Zrozumiałem, że zadanie powinno wyglądać następująco:

namespace :test do
  task :new_task => :environment do
    puts Parent.all.inspect
  end
end

Zwróć uwagę na => :environmentzależność dodaną do zadania

gmoniey
źródło
4
co oznacza ta składnia? przypisuje new_taskdo bieżącego środowiska? jaka jest aktualna wartość :environment? Google nie pomaga.
Scott Coates
12
@scoarescoare: środowisko tutaj jest zależnością, więc podczas działania new_tasknajpierw załaduj środowisko (załaduj modele), a następnie uruchom new_task.
bigpotato
3
@scoarescoare możesz sprawdzić niestandardowy dokument rake , pierwszy przykład powie Ci
lazybios
jak osiągnąć to samo w Sinatrze?
AMBasra,
nazwa modelu musi towarzyszyć wszystkim i nie działa bez niej jak TodoList.all.each nie TodoList.each idk dlaczego to działa?
Kick Buttowski,
17

może być wymagana konfiguracja (która powinna określać wszystkie wymagane modele itp.)

na przykład:

require 'config/environment'

alternatywnie możesz po prostu wymagać każdego z osobna, ale możesz mieć problemy ze środowiskiem AR nie skonfigurowane itp.

Luke Schafer
źródło
5
To zadziała, ale ogólnie złamie prowizję! Po dodaniu tej zmiany wypróbuj rake -T bez dostępnej bazy danych. rake -T powinien szczęśliwie dostarczyć listę zadań rake bez potrzeby dostępu do DB!
irkenInvader,
1
Po wykonaniu tej czynności okaże się, że wszelkie inne zadania prowizji wymagające inicjalizacji aplikacji (tj. Zasoby prowizji: prekompilacja) zakończą się niepowodzeniem z powodu „przerwania prowizji! Aplikacja została już zainicjowana”.
brent
11

Kiedy zaczniesz pisać zadania rake , użyj generatora, aby je dla ciebie wytłumaczyć.

Na przykład:

rails g task my_tasks task_one task_two task_three 

Otrzymasz kod pośredniczący utworzony w lib / task o nazwie my_tasks.rake(oczywiście użyj własnej przestrzeni nazw.) Który będzie wyglądał tak:

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

Wszystkie modele szyn itp. Będą dostępne dla bieżącego środowiska z każdego bloku zadań, chyba że korzystasz ze środowiska produkcyjnego , w którym to przypadku musisz wymagać konkretnych modeli, których chcesz użyć. Zrób to w ramach zadania. (IIRC różni się w zależności od wersji Rails.)

ocodo
źródło
2
Czy nie możesz po prostu powiedzieć, że environmentjest to wymagane jako zależność, a następnie powiedzieć składnię zamiast zachęcać OP do polegania na „magicznych” narzędziach, które nawet nie używają żadnej magii?
BalinKingOfMoria Przywróć CM
3

Dzięki nowej składni ruby ​​hash (Ruby 1.9) środowisko zostanie dodane do zadania rake w następujący sposób:

namespace :test do
  task new_task: :environment do
    puts Parent.all.inspect
  end
end
apadana
źródło
2

Zależność: środowisko jest dość poprawnie wywołana, ale rake wciąż może nie wiedzieć o innych klejnotach, od których zależą twoje modele - w jednym przypadku mój „chronione_atrybuty”.

Odpowiedź brzmi:

bundle exec rake test:new_task

Gwarantuje to, że środowisko zawiera wszystkie klejnoty określone w twoim pliku Gemfile.

Lex Lindsey
źródło
1

Wygeneruj zadanie za pomocą poniższego polecenia (przestrzeń nazw z nazwą zadania):

rails g task test new_task

Użyj poniższej składni, aby dodać logikę:

namespace :test do
  desc 'Test new task'
  task new_task: :environment do
    puts Parent.all.inspect
  end
end

Uruchom powyższe zadanie za pomocą polecenia poniżej:

bundle exec rake test:new_task  

lub

 rake test:new_task
Ni3
źródło