簡體   English   中英

在控制器中運行rake任務

[英]Run rake task in controller

我想在控制器中運行一個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任務不是一種好的樣式。 我建議將要執行的任務的代碼放在rake任務之外的某個地方,並讓rake任務調用此代碼。

這不僅具有易於在外部rake上調用(這是您想要的)的優點,而且還使測試rake任務更加容易。

與其嘗試在控制器中調用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

如果您不熟悉服務對象,它們只是做特定工作的普通舊紅寶石類。 如果您嘗試調用某些默認的rake任務(即db:migrate),則強烈建議不要從控制器執行此類操作。

您可以在控制器中執行以下操作:

%x[rake name_task]

與: name_task是您的任務的名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM