Is it possible to include modules in rake task and

2019-02-21 12:56发布

问题:

In our rails 3.2.12 app, there is a rake task created under lib/tasks. The rake task needs to call a method find_config() which resides in another rails module authentify (module is not under /lib/). Can we include Authentify in rake task and make method find_config() available to call in the rake task?

Here is what we would like to do in the rake task:

include Authentify
config = Authentify::find_config()

Thanks for comments.

回答1:

 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.



回答2:

How to require a Rails service/module in a Rake task?

I had the same problem and manage to solve it by requiring the rails files inside the rake task.

I had a rake task named give_something defined in the file lib/tasks/a_task.rake.

Within that task I needed to call the function give_something from the module AService which lives in the file app/services/a_service.rb

The rake task was defined as follows:

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

    AService.give_something(something, users)

  end
end

I was getting the error: uninitialized constant AService

To solve it I had to require the module not at the beginning of the file a_task.rake, but inside the rake task:

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


回答3:

In rails 5.x.x we can do as-

Module file exist her app/lib/module/sub_module.rb like-

module Module
  module SubModule

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

  end
end

and my rake_task presented here /lib/tasks/my_tasks.rake as-

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

Note:- the above task file presented in outer lib not in app/lib Now run the task using following command-

rake my_tasks:task_name

from app directory not from rails console

That worked for me !!!