是否可以在rake任务中包含模块并使其方法可用于rails app中的任务?

问题描述 投票:11回答:4

在我们的rails 3.2.12应用程序中,有一个rake tasklib/tasks下创建。 rake task需要调用一个方法find_config(),它位于另一个rails模块authentify(模块不在/ lib /下)。我们可以在include Authentify中使用rake task并使方法find_config()可以调用rake任务吗?

以下是我们想在rake task做的事情:

include Authentify
config = Authentify::find_config()

感谢您的评论。

ruby-on-rails ruby-on-rails-3 rake
4个回答
20
投票
 require 'modules/module_name'

 include ModuleName

 namespace :rake_name do

 desc "description of rake task"

  task example_task: :environment do

   result = ModuleName::method_name()


  end #end task


 end

这适合我。由于您的模块不在/ lib中,因此您可能需要编辑它的所需方式。但它应该工作。希望能帮助到你。


4
投票

请注意这一点,并保留一些随机的头痛!! 。 不要在命名空间之前包含模块:

include YourModule
namespace :your_name do
  desc 'Foo'
  task foo: :environment do
  end
end

或者在命名空间内:

namespace :your_name do
  include YourModule

  desc 'Foo'
  task foo: :environment do
  end
end

因为这将包括你的整个应用程序的模块,它可能会给你带来很多麻烦(比如我在模块中加入了一些:attr_accessors并打破了factory-bot功能或者过去因为同样的原因而发生的其他事情)。 “无问题”方式在您的任务范围内:

namespace :your_name do
  desc 'Foo'
  task foo: :environment do
    include YourModule
  end
end

是的,如果你有多个任务,你应该在每个任务中包括:

namespace :your_name do
  desc 'Foo'
  task foo: :environment do
    include YourModule
  end

  desc 'Bar'
  task bar: :environment do
    include YourModule
  end
end

或者,如果您只在任务中调用一次方法,则直接调用您的方法:

namespace :your_name do
  desc 'Foo'
  task foo: :environment do
    YourModule.your_method
  end

  desc 'Bar'
  task bar: :environment do
    YourModule.your_method
  end
end

2
投票

如何在Rake任务中要求Rails服务/模块?

我有同样的问题,并设法通过要求rake任务中的rails文件来解决它。

我在文件give_something中定义了一个名为lib/tasks/a_task.rake的rake任务。

在该任务中,我需要从give_something模块调用函数AService,该模块位于app/services/a_service.rb文件中

rake任务定义如下:

namespace :a_namespace do
  desc "give something to a list of users"
  task give_something: :environment do

    AService.give_something(something, users)

  end
end

我得到了错误:uninitialized constant AService

为了解决这个问题,我不得不要求模块不在文件a_task.rake的开头,而是在rake任务中:

namespace :a_namespace do
  desc "give something to a list of users"
  task give_something: :environment do

    require 'services/a_service' # <-- HERE!
    AService.give_something(something, users)

  end
end

1
投票

在rails 5.x.x中我们可以做 -

模块文件存在她的app/lib/module/sub_module.rb像 -

module Module
  module SubModule

    def self.method(params1, params2)
      // code goes here...
    end

  end
end

我的rake_task在这里介绍/lib/tasks/my_tasks.rake-

namespace :my_tasks do
  desc "TODO"
  task :task_name => :environment do
    Module::SubModule.my_method(params1, params2)
  end
end

注意: - 上面的任务文件在外部库中显示而不是在app / lib中现在使用以下命令运行任务 -

rake my_tasks:task_name

来自app目录而不是来自rails console

这对我有用!!!

© www.soinside.com 2019 - 2024. All rights reserved.