辅助方法我指的是帮助我的方法,而不是辅助文件中的方法
我有一个类方法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'
我错过了什么吗?
答案 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