Я хотів би запустити завдання граблі у своєму контролері. Чи є спосіб зробити це?
Відповіді:
Я погоджуюся з 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.
config/application.rb
ім'я модуля знаходиться приблизно на 12 рядків вниз, припускаючи, що ви використовуєте Rails.
Rails.application
Я не вважаю хорошим стилем називати рейк-завдання в коді. Я рекомендую помістити код для завдання, яке ви хочете виконати, десь поза завданням згрібання, і нехай виклик виклику цього коду.
Це не тільки має перевагу в тому, що легко викликати зовнішні рейки (що саме вам потрібно), але і значно полегшує тестування завдання на рейк.
Замість того, щоб намагатись викликати завдання rake у контролері, зателефонуйте об’єктам служби, що містять будь-яку логіку, яку ви намагаєтесь виконати.
class SomeController < ApplicationController
def whatever
SomeServiceObject.call
end
end
... а потім, припускаючи, що ви говорите про спеціальне завдання згрібання, попросіть його також викликати об’єкт служби:
namespace :example do
desc 'important task'
task :important_task do
SomeServiceObject.call
end
end
Якщо ви не знайомі з сервісними об'єктами, це просто звичайні рубінові класи, які виконують певну роботу. Якщо ви намагаєтеся викликати деякі завдання за замовчуванням (наприклад: db: migrate), я настійно не рекомендую робити подібні дії з контролера.
Ви можете зробити це у своєму контролері:
%x[rake name_task]
with: name_task
- це назва вашого завдання