Rake task во время инициализации приложения rails

Я хочу выполнить задачу rake при запуске сервера моего приложения.

В config / application.rb я поместил следующее:

if !Rails.env.production?
  Rake::Task[ "init:db_records" ].invoke
end 

Задача rake четко определена и выполняется без проблем, если я вызываю ее с терминала.

rake init:db_records

Но при размещении в config / application.rb (или даже в любых инициализаторах / *) я получил следующую ошибку.

Не знаю, как собрать задачу 'init: db_records'

Каким образом можно выполнить рейк-задачу при запуске сервера?

Спасибо!


person Rails Rails    schedule 01.06.2015    source источник


Ответы (3)


В Rails уже есть механизм для создания базы данных разработки - rake db:seed. Он не запускается автоматически при запуске приложения, но запускается как часть rake db:setup.

Если у вас нет веской причины, обычно лучше придерживаться соглашений, которые предоставляет Rails.

person Andy Waite    schedule 01.06.2015

Для тех, кто столкнется с той же проблемой в будущем.

Я добился этого, создав новый файл в каталоге initializers, куда я поместил код задачи rake.

Преимущество этого на данном этапе в том, что приложение уже загружено, поэтому у вас есть доступ к функциям ActiveRecord ...

Помещение кода непосредственно в config / application.rb не сработало, так как мои модели еще не были загружены.

Надеюсь, это поможет!

person Rails Rails    schedule 03.06.2015

Ваши задачи Rake (вероятно) определены в Rakefile. initializer не знает, что файл вообще существует, поэтому он не знает о задачах внутри.

Самый простой способ обойти это - сделать что-то вроде этого:

Dir.chdir(Rails.root) do
  `rake init:db_records`
end

То есть измените рабочий каталог на корневой каталог rails, а затем выполните команду.

person TheSuper    schedule 01.06.2015
comment
Спасибо за ответ, но когда я помещаю Dir.pwd, я вижу, что я уже нахожусь в корневом каталоге. Более того, это не сработало, получив ту же ошибку .. - person Rails Rails; 03.06.2015
comment
Вы вызываете его с помощью метода Rake::Task["name"].invoke или метода оболочки? - person TheSuper; 03.06.2015
comment
Я вызываю его с помощью метода Rake :: Task [name] .invoke - person Rails Rails; 03.06.2015
comment
Я мог бы решить свою проблему, подробности вы можете уточнить в моем ответе - person Rails Rails; 03.06.2015