3

我正在尝试将一些模型代码移动到模块中。

原始模型方法:

我正在尝试将一些模型代码移动到模块中。

原始模型方法:

class Book < ActiveRecord::Base
  def book_royalty(period='enddate', basis="Net receipts")
    #stuff
  end
end

所以我添加

include Calculation   

并将方法移动到模块:

module Calculation
  def book_royalty(period='enddate', basis="Net receipts")
    #stuff
  end
end

但现在我得到

参数数量错误(2 代表 0)

如果我将 book.rb 模型中的方法设为类方法(即,如果我将方法名称设为方法名称),这也是我得到的错误self.book_royalty(args)

我是否无意中将方法移至模块类方法?我include在 book.rb 中使用,而不是extend. 如何让父模型成功包含模块的方法?

编辑

book_royalty在版税声明模型中被调用。

书.rb:

attr_accessor :book_royalty

版税声明.rb:

def initialize_arrays
  @royalty  = []
  ...
end

def sum_at_book_level(contract)
  contract.books.where(:exclude_from_royalty_calc => false).each do |book| 
    book.book_royalty("enddate", basis)
    @royalty.push(book.book_royalty("enddate", basis))
    # etc
end
4

1 回答 1

5

解释:

您的模块定义了一个带有book_royalty两个参数的方法。然后,在包含该模块后的几行中,您使用attr_accessor定义两个方法的类宏,

def book_royalty
  @book_royalty
end

def book_royalty= val
  @book_royalty = val
end

这有效地覆盖了你book_royalty的模块。现在它不接受任何参数。因此错误

参数数量错误(2 代表 0)

尝试执行行时

book.book_royalty("enddate", basis)

不需要 attr_accessor或其他任何东西来使用包含模块中的方法。它会自动变为可用。

于 2012-04-07T19:40:20.353 回答