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

时间:2013-06-25 17:48:00

标签: ruby-on-rails ruby-on-rails-3 rake

在我们的rails 3.2.12应用中,rake task下创建了lib/tasksrake task需要调用另一个rails模块find_config()中的方法authentify(模块不在/ lib /下)。我们可以在include Authentifyrake task并使方法find_config()可以在rake任务中调用吗?

以下是我们希望在rake task中执行的操作:

include Authentify
config = Authentify::find_config()

感谢您的评论。

4 个答案:

答案 0 :(得分: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中,因此您可能需要编辑它的所需方式。但它应该工作。希望它有所帮助。

答案 1 :(得分:2)

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

我遇到了同样的问题,并通过在rake任务中要求使用rails文件来解决该问题。

我在文件give_something中定义了一个名为lib/tasks/a_task.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

答案 2 :(得分: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
  

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

rake my_tasks:task_name

从应用程序目录而不是从rails console

对我有用!

答案 3 :(得分:0)

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

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_accessor,破坏了工厂机器人的功能或其他出于同样的原因)。 “没有问题”的方式是这样的:

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