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

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


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.


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.)


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.