Я хочу запустить задачу rake в моем контроллере. Есть ли способ сделать это?
Запустить команду rake в контроллере
Ответ 1
Я согласен с ddfreynee, но если вы знаете, что вам нужно, код может выглядеть так:
require 'rake'
Rake::Task.clear # necessary to avoid tasks being loaded several times in dev mode
Sample::Application.load_tasks # providing your application name is 'sample'
class RakeController < ApplicationController
def run
Rake::Task[params[:task]].reenable # in case you're going to invoke the same task second time.
Rake::Task[params[:task]].invoke
end
end
Вместо этого вы можете потребовать "rake" и .load_tasks в инициализаторе.
Ответ 2
Я не считаю, что это хороший стиль, чтобы вызвать команду rake в коде. Я рекомендую поместить код для задачи, которую вы хотите выполнить где-то за пределами задачи rake, и заставить команду rake вызвать этот код.
Это не только имеет преимущество, заключающееся в том, что легко вызвать внешний грабли (это то, что вам нужно), но также облегчает проверку задачи рейка.
Ответ 3
Вы можете сделать это в своем контроллере:
%x[rake name_task]
с: name_task
- имя вашей задачи
Ответ 4
Вместо того, чтобы пытаться вызвать команду rake в контроллере, вызовите объекты службы, которые содержат любую логику, которую вы пытаетесь выполнить.
class SomeController < ApplicationController
def whatever
SomeServiceObject.call
end
end
... и затем, предположив, что вы говорите о пользовательской задаче rake, вызовите также объект службы:
namespace :example do
desc 'important task'
task :important_task do
SomeServiceObject.call
end
end
Если вы не знакомы с объектами сервиса, это просто старые классы ruby, которые выполняют определенную работу. Если вы пытаетесь вызвать некоторые из заданий rake по умолчанию (то есть: db: migrate), я бы очень рекомендовал не делать этого с контроллера.