定义在rails模型中使用的函数的正确方法是什么?

时间:2013-09-20 02:39:38

标签: ruby-on-rails

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

我的第一个解决方案是在我的模型文件中执行类似的操作(比如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并浏览互联网让我相信我所做的通常不是由其他人完成的...有些人似乎使用模块但在我的情况下,这个功能只是在此文件中需要。我只是将它定义为干掉我的代码或使其更具可读性,但我不认为它应该是一个实例方法,因为我不需要从该文件外部调用它,它也不需要是一个类方法出于同样的原因。 在哪里定义这样的函数的正确位置?

1 个答案:

答案 0 :(得分:5)

很难说不知道magic_function做了什么,但似乎你希望它是private

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

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

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

但请注意,您仍然不应该仅仅因为您不应该存根system under test而存根magic_function。它应该通过公共方法隐式测试。如果您想单独测试它,您应该将它放在一个新的类或模块中,然后从用户调用它。