1

如果我的一个模型函数做了一些复杂的事情,或者它的逻辑有一些部分可以在另一个模型函数中重用,那么在模型中定义第三个函数使其成为实例方法或将其定义为类方法是否正确?

我的第一个解决方案是在我的模型文件(比如 user.rb)中做这样的事情:

#Some Function
def magic_function
  return true
end

class User < ActiveRecord::Base
  def first_function
    return magic_function
  end

  def second_function
    return 1 if magic_function
    return 0
  end
end

但是我在进行 rspec 测试和浏览互联网时无法存根 magic_function 让我相信我所做的通常不是由其他人完成的......有些人似乎使用模块,但在我的情况下,这个函数只需要在这个文件。我只是将它定义为干燥我的代码或使其更具可读性,但我认为它不应该是一个实例方法,因为我不需要从这个文件外部调用它,它也不需要是一个类方法出于同样的原因。定义这样的函数的正确位置在哪里?

4

1 回答 1

5

不知道做什么很难说magic_function,但似乎你希望它是私有的:

class User < ActiveRecord::Base
  def first_function
    return magic_function
  end

  def second_function
    return 1 if magic_function
    return 0
  end

  private

  def magic_function
    return true
  end
end

这将允许您magic_function从 User 的其他实例方法调用,但不能从它外部调用:

user = User.new
user.first_function  # works
user.magic_function  # NoMethodError: private method `magic_function' called

但是请注意,您仍然不应该magic_function仅仅因为您不应该存根被测系统而存根。它应该通过公共方法进行隐式测试。如果你想单独测试它,你应该把它放在一个新的类或模块中,并从用户那里调用它。

于 2013-09-20T02:42:54.273 回答