Ruby on rails 在控制器中运行rake任务

Ruby on rails 在控制器中运行rake任务,ruby-on-rails,ruby,rake,Ruby On Rails,Ruby,Rake,我想在我的控制器中运行一个rake任务。有什么方法可以做到这一点吗?我觉得在代码中调用rake任务不是一种好的方式。我建议将要执行的任务的代码放在rake任务之外的某个地方,并让rake任务调用此代码 这不仅具有易于调用外部rake(这是您想要的)的优点,而且还使测试rake任务变得更加容易。您可以在控制器中执行此操作: %x[rake name_task] 使用:name\u task是您任务的名称我同意ddfreynee,但如果您知道您需要什么,代码可以是这样的: require 'rak

我想在我的控制器中运行一个rake任务。有什么方法可以做到这一点吗?

我觉得在代码中调用rake任务不是一种好的方式。我建议将要执行的任务的代码放在rake任务之外的某个地方,并让rake任务调用此代码


这不仅具有易于调用外部rake(这是您想要的)的优点,而且还使测试rake任务变得更加容易。

您可以在控制器中执行此操作:

%x[rake name_task]

使用:
name\u task
是您任务的名称

我同意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
require'rake'
Rake::Task.clear#避免在开发模式下多次加载任务所必需的
示例::Application.load_tasks#提供的应用程序名称为“Sample”
类RakeControl<应用程序控制器
def运行
Rake::Task[params[:Task]].可重新启用#以防第二次调用同一个任务。
Rake::Task[params[:Task]]。调用
结束
结束

您可以在初始值设定项中要求“rake”和.load_任务。

不要尝试在控制器中调用rake任务,而是调用包含您尝试执行的任何逻辑的服务对象

class SomeController < ApplicationController
  def whatever
    SomeServiceObject.call
  end
end

如果您不熟悉服务对象,那么它们只是执行特定任务的普通ruby类。如果您试图调用一些默认的rake任务(即:db:migrate),我强烈建议不要从控制器中调用此类任务。

+1我同意:这是一个完美的例子,说明应该以两种不同的方式进行重构和调用。似乎是运行rake的一个很好的理由。对于“rake任务之外的某个地方”来说,好的“某处”在哪里?@user456584如果它与模型相关,请将它放在model类中。如果它与其他内容相关,请创建一个保存它们的新文件。在我的情况下,我需要从第三方库运行一个任务,因此我无法重构它(不经历分叉等麻烦)如何将环境传递给它?在生产环境中,我永远不会从我的控制器中掏钱来进行rake。@Duke当您回答或评论时,您能否解释您的推理,而不仅仅是做出断言(生产环境中的控制器不应调用rake任务)?这将有助于人们理解你的推理,而不仅仅是知道你不会做什么(但不会听到你解释原因)。@Matt shelling out意味着Rake将在另一个过程中执行。这意味着它将启动一个新的ruby解释器。还有一种可能性是,注入会导致执行任意命令(还有一些打字错误)。我在哪里可以找到我的“应用程序名”呢?@pxdle如果在
config/application.rb
中,模块名大约在12行以下,假设您使用的是Rails。您还可以通过调用
Rails来引用您的应用程序。应用程序
这非常有效!其他人很清楚,此方法用于同步调用rake任务(在rake完成之前页面不会呈现)。对于异步使用,请使用此rails cast中的call\u rake:实际上,在多做一点工作之后,rails 3.2.13上的我的应用程序只需要Sample::Application.load\u tasks行。如果我包括Task.clear行,我的应用程序将一直工作,直到我调用第一个rake,然后它会给出一个关于我为doc:app所做的自定义覆盖的错误。但这只是我在RailsCasts第127集中对Bates的评价。试试这个>>
系统“rake task\u name”
@Bongs是的,你是对的,这对我来说很好,系统(“rake task\u name”)这是一个非常干净的方法。谢谢。这个概念很简单。它工作得很好!我没有在
SomeServiceObject
中添加代码。我用
self
在模型中写作,并从rake任务调用如下:
User.subscribe\u fcm
namespace :example do
  desc 'important task'
  task :important_task do
    SomeServiceObject.call
  end
end