在我们的rails 3.2.12
应用中,rake task
下创建了lib/tasks
。 rake task
需要调用另一个rails模块find_config()
中的方法authentify
(模块不在/ lib /下)。我们可以在include Authentify
中rake task
并使方法find_config()
可以在rake任务中调用吗?
以下是我们希望在rake task
中执行的操作:
include Authentify
config = Authentify::find_config()
感谢您的评论。
答案 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