在我们的rails 3.2.12
应用程序中,有一个rake task
在lib/tasks
下创建。 rake task
需要调用一个方法find_config()
,它位于另一个rails模块authentify
(模块不在/ lib /下)。我们可以在include Authentify
中使用rake task
并使方法find_config()
可以调用rake任务吗?
以下是我们想在rake task
做的事情:
include Authentify
config = Authentify::find_config()
感谢您的评论。
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中,因此您可能需要编辑它的所需方式。但它应该工作。希望能帮助到你。
请注意这一点,并保留一些随机的头痛!! 。 不要在命名空间之前包含模块:
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
s并打破了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
如何在Rake任务中要求Rails服务/模块?
我有同样的问题,并设法通过要求rake任务中的rails文件来解决它。
我在文件give_something
中定义了一个名为lib/tasks/a_task.rake
的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
在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
注意: - 上面的任务文件在外部库中显示而不是在app / lib中现在使用以下命令运行任务 -
rake my_tasks:task_name
来自app目录而不是来自rails console
这对我有用!!!