18

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

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

include Authentify
config = Authentify::find_config()

感谢您的评论。

4

4 回答 4

23
 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

This works for me. Since your Module is not in /lib you might have to edit how it is required. But it should work. Hope it helps.

于 2014-06-21T01:21:01.193 回答
15

请注意这一点并避免一些随机头痛!.
不要在命名空间之前包含您的模块:

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
于 2019-03-05T20:38:15.903 回答
5

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

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

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

在该任务中,我需要从文件中give_something的模块调用函数AServiceapp/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.rakerake 任务中要求模块:

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
于 2018-09-20T18:18:34.463 回答
4

在 rails 5.xx 我们可以这样做-

模块文件存在她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

来自应用程序目录而不是来自rails console

这对我有用!

于 2019-01-18T08:44:26.270 回答