在控制器中运行rake任务
我想在我的控制器中运行一个rake任务。 有没有办法做到这一点?
我同意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。
在代码中调用一个rake任务,我觉得不好。 我build议把任务的代码放在rake任务之外的地方,然后让rake任务调用这个代码。
这不仅具有易于在耙外(这是你想要的)调用的优点,而且还使testing耙测任务变得更容易。
你可以在你的控制器中做到这一点:
%x[rake name_task]
与: name_task
是您的任务的名称
不要试图在控制器中调用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),我会强烈build议不要从控制器那里做这样的事情。