7

我一直在构建一个执行会计功能的 Rails 应用程序。作为其中的一部分,我有一个带有类名的模型Transaction。到目前为止一切顺利,我已经构建这个功能一个月左右,一切都按预期工作。

到目前为止...

我刚刚发现几个月前使用 Ruport 库开发的一些较旧的报告功能已经停止工作。似乎 Ruport 在生成 PDF 时需要一个库,该库也有一个名为Transaction.

TypeError in Admin/team reportsController#generate
Transaction is not a module

...

This error occurred while loading the following files:
  pdf/writer
  transaction/simple

所以,我在这里寻找一个快速修复。希望不涉及重命名我的Transaction模型和重构过去几周的代码。

期待一些聪明的建议:)

4

3 回答 3

15

已经回答了,但是我带着同样的问题来到这里,但以不同的方式解决了它。

我有两个名为 Pull 和 Query 的模型。尝试Query.some_static_method()在 Pull 中的方法内引用导致 Query 解析为ActiveRecord::AttributeMethods::Query:Module.

通过将空名称空间放在它前面来解决它::Query.some_static_method()

于 2010-11-17T15:32:55.153 回答
8

我认为问题在于 Ruport 需要 PDF::Writer gem,而后者又需要定义模块 Transaction 的 Transaction::Simple gem。

ActiveRecord 中肯定有一个#transaction 方法,但我认为 Rails 中没有 Transaction 模块或类。我很乐意在那个问题上得到纠正。

命名空间通常是避免此类命名冲突的最佳实践。例如

module Account
  class Transaction < ActiveRecord::Base
    ....
  end
end 

但是,命名空间 ActiveRecord 模型可能会引发其他问题。

尽管可能很耗时,但重命名 Transaction 模型可能是最好的选择。

如果需要,您仍然可以保留现有的事务数据库表,因此无需更改迁移,只需将其放入self.table_name = "transactions"模型中即可。

您与其他模型的关联也可以通过在关联调用中指定 class_name 来命名为“事务”。例如

class User < ActiveRecord::Base

  has_many :transactions, :class_name => "AccountTransaction"

end

这两个建议可能会也可能不会为您节省一些时间。

于 2010-09-17T13:48:12.370 回答
1

您的问题可能来自 Transaction 也是 Rails 中的保留字……</p>

于 2010-09-17T13:20:43.797 回答