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

Ahm*_*thy 1 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
Run Code Online (Sandbox Code Playgroud)

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

And*_*all 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
Run Code Online (Sandbox Code Playgroud)

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

user = User.new
user.first_function  # works
user.magic_function  # NoMethodError: private method `magic_function' called
Run Code Online (Sandbox Code Playgroud)

但是请注意,您应该仍然不应该magic_function仅仅因为您不应该存根被测系统.它应该通过公共方法隐式测试.如果要单独测试,则应将其放入新的类或模块中,然后从用户调用它.