我想为查询对象创建一个模块。我创建了一个文件:
app/queries/invoices/edit.rb
这个班级:
module Queries
module Invoices
class Edit
end
end
end
但是,我无法初始化它:
2.3.3 :001 > Queries::Invoices::Edit.new
NameError: uninitialized constant Queries
当我省略Queries
模块时,一切正常:
module Invoices
class Edit
end
end
2.3.3 :005 > Invoices::Edit.new
=> #<Invoices::Edit:0x007fc729e15558>
为什么?
答案 0 :(得分:1)
app
下的第一个级别不被视为命名空间的一部分。这就是为什么你不说,例如:
module Models
class Foo < ActiveRecord::Base
end
end
代表app/models/foo.rb
这样的模型。
如果您希望在命名空间中使用Queries
,则可以执行以下操作:
app/queries/queries/invoices/edit
但是,这看起来很危险。我想我会做更多的事情:
app/queries/invoice_queries/edit
然后:
module InvoiceQueries
class Edit
end
end
答案 1 :(得分:1)
@ jvillian的回答是正确的。但是,我不喜欢这两种选择:)
我在项目中所做的是将所有这些自定义对象类型放入app/lib
app/lib/queries/invoices/edit.rb
app/lib/services/invoices/sync.rb
这种方式lib
用作填充,它将queries
作为命名空间的一部分。此外,所有“非标准”代码都包含在一个目录中。