如何解决Rails项目中的耙子范围?
| 在我正在处理的项目中,有很多使用rake运行的解析器。当使用另一个耙中已经存在的方法名称时,由于它们都使用相同的环境,因此会发生冲突。 有没有办法限制rake文件在其命名空间中的范围?我以为那是命名空间的全部内容? 例:namespace :test do
task :test_task => :environment do
...
end
def test_method(argument)
...
end
end
namespace :other_test do
task :test_task => :environment do
...
end
def test_method(argument,argument2)
...
end
end
在这种情况下,运行ѭ1时,我将收到无效数量的参数错误。另一方面,如果我在任务本身中定义方法,则必须按顺序将方法保持在rake文件的顶部。这变得有些混乱和丑陋。
这仅仅是必要的邪恶吗?
谢谢!
解决方法
我看到rake任务的名称空间与文件系统中的目录具有相同的作用:它们与组织而不是封装有关。这就是为什么数据库任务位于
db:
中,Rails任务位于rails:
中,等等。
Rake命名空间不是类,因此当您在Rake命名空间中定义4时,您需要问自己要添加哪个类。答案是对象。因此,当您执行第二项任务时,Object已经有一个采用一个参数的test_method
方法,而Ruby正确地抱怨了。
最好的解决方案是使您的Rake任务非常薄(就像控制器一样),并将任何支持方法(例如test_method
)放在合理的某个库文件中。 Rake任务通常应该进行一些设置,然后调用库方法来完成实际工作(即与控制器相同的常规布局)。
执行摘要:将所有实际工作和繁重的工作放在库文件中的某个位置,并使Rake任务成为库的薄包装器。这应该使您的问题通过适当的代码组织解决。
, module Anonymous
namespace :test do
# brabra
end
end
self.class.send(:remove_const,:Anonymous)
module Anonymous
namespace :another_test do
# brabra
end
end
self.class.send(:remove_const,:Anonymous)
definition8ѭ块需要您定义self::
。为避免这种情况,您需要命名模块并删除它。
, 我已经找到了一种在Rake任务中为方法命名空间的方法,因此同名方法不会冲突。
将每个外部名称空间包装在唯一命名的模块中。
extend Rake::DSL
将您的方法更改为类方法(使用self.
)。
我已经对此进行了测试,它仍然允许一个rake任务调用或依赖于另一个模块中的另一个rake任务。
例:
module Test
extend Rake::DSL
namespace :test do
task :test_task => :environment do
...
end
def self.test_method(argument)
...
end
end
end
module OtherTest
extend Rake::DSL
namespace :other_test do
task :test_task => :environment do
...
end
def self.test_method(argument,argument2)
...
end
end
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。