模型代码到模块:错误的args数量,类/实例方法?

sno*_*gel 3 ruby module ruby-on-rails

我试图将一些模型代码移动到一个模块.

原始模型方法:

我试图将一些模型代码移动到一个模块.

原始模型方法:

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

所以我补充一下

include Calculation   
Run Code Online (Sandbox Code Playgroud)

并将方法移动到模块:

module Calculation
  def book_royalty(period='enddate', basis="Net receipts")
    #stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

但现在我得到了

错误的参数数量(2表示0)

如果我在book.rb模型中创建一个类方法,即如果我创建方法名称,那么这也是我得到的错误self.book_royalty(args).

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

编辑

book_royalty 在Royaltystatement模型中调用.

book.rb:

attr_accessor :book_royalty
Run Code Online (Sandbox Code Playgroud)

royaltystatement.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
Run Code Online (Sandbox Code Playgroud)

Ser*_*sev 5

说明:

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

def book_royalty
  @book_royalty
end

def book_royalty= val
  @book_royalty = val
end
Run Code Online (Sandbox Code Playgroud)

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

错误的参数数量(2表示0)

当试图执行行时

book.book_royalty("enddate", basis)
Run Code Online (Sandbox Code Playgroud)

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