导轨和模块

时间:2016-12-13 15:38:06

标签: ruby-on-rails ruby

我想为查询对象创建一个模块。我创建了一个文件:

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>

为什么?

2 个答案:

答案 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作为命名空间的一部分。此外,所有“非标准”代码都包含在一个目录中。