ruby-on-rails - generate - ruby on rails rake
Ejecutar tarea de rake en el controlador (4)
Me gustaría ejecutar una tarea de rake en mi controlador. ¿Hay alguna manera de hacer esto?
En lugar de tratar de llamar a una tarea de rake en un controlador, llame a un servicio de objetos que contenga cualquier lógica que esté tratando de ejecutar.
class SomeController < ApplicationController
def whatever
SomeServiceObject.call
end
end
... y luego, suponiendo que esté hablando de una tarea de rake personalizada, haga que llame al objeto de servicio también:
namespace :example do
desc ''important task''
task :important_task do
SomeServiceObject.call
end
end
En caso de que no esté familiarizado con los objetos de servicio, son simples clases antiguas de ruby que hacen un trabajo específico. Si está intentando llamar a algunas de las tareas de rake predeterminadas (es decir: db: migrate), le recomendaría no hacer ese tipo de cosas desde un controlador.
Estoy de acuerdo con ddfreynee, pero en caso de que sepa lo que necesita, el código puede verse así:
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
En su lugar, puede requerir ''rake'' y .load_tasks en un inicializador.
No me parece bien llamar una tarea de rake en el código. Recomiendo poner el código para la tarea que desea ejecutar en algún lugar fuera de una tarea de rake, y hacer que la tarea de rake llame a este código.
Esto no solo tiene la ventaja de ser fácil de llamar al rake externo (que es lo que desea), sino que también hace que sea mucho más fácil probar la tarea de rake.
Puedes hacer esto en tu controlador:
%x[rake name_task]
con: name_task
es el nombre de tu tarea