2009-07-23 9 views
63

Me gustaría ejecutar una tarea de rake en mi controlador. ¿Hay alguna manera de hacer esto?Ejecutar tarea de rake en el controlador

+1

http://railscasts.com/episodes/127-rake-in-background – baash05

+5

intente esto >> 'system" rake task_name "' – Bongs

+0

Ryan Bates cubre [un par de formas] (http://railscasts.com/episodes/127-rake-in-background) en RailsCasts Episodio # 127. –

Respuesta

49

No me parece un buen estilo para llamar a 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.

+6

+1 Estoy de acuerdo: este es un ejemplo perfecto de cosas que deben ser refactorizadas y llamadas de dos maneras diferentes. –

+7

http://railscasts.com/episodes/127-rake-in-background Parece una excelente razón para ejecutar un rake .. – baash05

+4

¿Dónde estaría un buen "lugar" para "algún lugar fuera de la tarea de rake"? – user456584

16

Usted puede hacer esto en su controlador:

%x[rake name_task] 

con: name_task es el nombre de su tarea

+2

¿cómo le pasas el entorno? – serengeti12

+3

nunca pagaría en mi controlador en producción. – Duke

+14

@Duke cuando responde o comenta puede también explicar su razonamiento y no solo hacer una afirmación (que un controlador en producción no debe llamar a las tareas de rake)? Esto ayudaría a las personas a comprender su razonamiento en lugar de simplemente saber lo que no haría (pero no escuchar su explicación de por qué). – Matt

55

Estoy de acuerdo con ddfreynee, pero en caso de que sabe lo que necesita código puede verse como:

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 necesitar 'rake' y .load_tasks en un inicializador.

+0

¿Dónde encontraré mi "nombre de aplicación"? – pdxleif

+0

@pxdleif Está en 'config/application.rb' como el nombre del módulo a unas 12 líneas hacia abajo, suponiendo que está utilizando Rails. –

+1

También puede hacer referencia a su aplicación llamando 'Rails.application' – declan

8

En lugar de intentar llamar a una tarea de rake en un controlador, llame a un servicio de objetos que contenga la lógica que esté intentando ejecutar.

class SomeController < ApplicationController 
    def whatever 
    SomeServiceObject.call 
    end 
end 

... y luego, suponiendo que estamos hablando de una tarea personalizada rastrillo, que se llama el objeto de servicio, así:

namespace :example do 
    desc 'important task' 
    task :important_task do 
    SomeServiceObject.call 
    end 
end 

En caso de que usted no está familiarizado con los objetos de servicio, se son simplemente viejas clases de rubíes 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.

+0

Esta es una forma muy limpia de hacerlo. Gracias. – juliangonzalez

Cuestiones relacionadas