Можно ли включить модули в граблированную задачу и сделать ее методы доступными для задачи в приложении 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
Это сработало для меня!