Можно ли включить модули в граблированную задачу и сделать ее методы доступными для задачи в приложении rails?

В нашем rails 3.2.12 приложении есть rake task, созданный в lib/tasks. rake task необходимо вызвать метод find_config(), который находится в другом модуле rails authentify (модуль не находится под /lib/ ). Можем ли мы include Authentify в rake task и сделать метод find_config() доступным для вызова в рейк-задании?

Вот что мы хотели бы сделать в rake task:

include Authentify
config = Authentify::find_config()

Спасибо за комментарии.

Ответ 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

Это работает для меня. Поскольку ваш модуль не находится в /lib, вам, возможно, придется отредактировать, как это требуется. Но это должно сработать. Надеюсь, что это поможет.

Ответ 2

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ НА ЭТО И СОХРАНИТЕ НЕКОТОРЫЕ СЛУЧАЙНЫЕ ШАГИ !! ,
Не включайте ваш модуль перед вашим пространством имен:

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 и нарушение работы 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

Ответ 3

Как требовать сервис/модуль Rails в задаче Rake?

У меня была та же проблема, и мне удалось ее решить, потребовав файлы rails внутри задачи rake.

У меня была рейк-задача с именем give_something определенная в файле lib/tasks/a_task.rake.

В рамках этой задачи мне нужно было вызвать функцию give_something из модуля AService который находится в файле app/services/a_service.rb

Задача граблей была определена следующим образом:

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

Ответ 4

В рельсах 5.xx мы можем сделать as-

Файл модуля существует в ее app/lib/module/sub_module.rb like-

module Module
  module SubModule

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

  end
end

и мой rake_task представлен здесь /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

Примечание: - указанный выше файл задачи представлен во внешней библиотеке, а не в app/lib. Теперь запустите задачу, используя следующую команду command-

rake my_tasks:task_name

из каталога приложения, а не из rails console

Это сработало для меня!