Run rake task in controller

有些话、适合烂在心里 提交于 2019-12-17 05:41:27

问题


I'd like to run a rake task in my controller. Is there any way to do this?


回答1:


I agree with ddfreynee, but in case you know what you need code can look like:

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

You can require 'rake' and .load_tasks in an initializer instead.




回答2:


I don't find it good style to call a rake task in code. I recommend putting the code for the task that you want to execute somewhere outside a rake task, and have the rake task call this code.

This not only has the advantage of being easy to call outside rake (which is what you want), but it also makes it much easier to test the rake task.




回答3:


Instead of trying to call a rake task in a controller, call a service objects that contains whatever logic you are trying to execute.

class SomeController < ApplicationController
  def whatever
    SomeServiceObject.call
  end
end

...and then, assuming you are talking about a custom rake task, have it call the service object as well:

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

In case you are not familiar with service objects, they are just plain old ruby classes that do a specific job. If you are trying to call some of the default rake tasks (ie: db:migrate) I would highly recommend not doing that sort of thing from a controller.




回答4:


You can do this in your controller:

%x[rake name_task]

with: name_task is the name of your task



来源:https://stackoverflow.com/questions/1170148/run-rake-task-in-controller

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!