在模型中使用辅助方法

时间:2014-05-14 09:11:50

标签: ruby-on-rails ruby class methods model

辅助方法我指的是帮助我的方法,而不是辅助文件中的方法

我有一个类方法User.make_from_file,里面我有非常难看的逻辑。我想把它分成方法但由于某种原因它不起作用

class User

...

def self.make_from_file(filename)

some logic

User.new(read_attr_from_file(filename))

end

  private

  def read_attr_from_file(filename)
    some logic
  end

end

但我得到

NoMethodError: undefined method `read_attr_from_file' for #<Class:0x007fa4d4b4b290>
from /Users/guy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.5/lib/active_record/dynamic_matchers.rb:22:in `method_missing'

我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

class User

   def self.make_from_file(filename)
      User.new(read_attr_from_file(filename))
   end

   private

   def self.read_attr_from_file(filename)
      ...
   end

end

试试这个

答案 1 :(得分:1)

要进一步jbmyid的答案,您将从查看difference between instance & class methods

中受益
  

您正在尝试填充该课程的new instance   使用instance方法

     

这不起作用,因为设计了实例方法   加载已经触发其initialize方法的类。由于您的read_attr_from_file不属于任何预定义的类,因此您需要将其设为class method


<强>更新

如果您正在尝试调用类方法,那么类是什么并不重要;你必须在没有先前初始化类的情况下这样做。即:

def self.read_attr_from_file filename
  ...
end

#-> User.read_attr_from_file filename

如果您想在已初始化的类(类的instance)上调用方法,则可以使用:

def read_attr_from_file filename
end

# -> user = User.new
# -> user.read_attr_from_file

就答案而言,您必须记住您正在调用User.new(类方法),但为了填充新对象,您需要使用另一个方法,该方法将运行在非初始化对象上,因此它需要是一个类方法:

Class User < ActiveRecord::Base

   def self.make_from_file filename
       User.new read_attr_from_file(filename)

       #-> User.new is class method
       #-> read_attr_from_file called on class, needs to be class method
   end

   private

   def self.read_attr_from_file filename
   end

end