Подтвердить что ты не робот

Запустить команду rake в контроллере

Я хочу запустить задачу rake в моем контроллере. Есть ли способ сделать это?

4b9b3361

Ответ 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), я бы очень рекомендовал не делать этого с контроллера.