我有一个非activerecord rails模型:
/usr/share/elasticsearch
为了找到Document,我可以使用:
class Document
attr_accessor :a, :b
include ActiveModel::Model
def find(id)
initialize_parameters(id)
end
def save
...
end
def update
...
end
private
def initialize_parameters(id)
@a = 1
@b = 2
end
end
因此,为了直接获取它,我将find方法更改为
Document.new.find(3)
运行
时出现以下错误def self.find(id)
initialize_parameters(id)
end
Document:Class
的未定义方法`initialize_parameters'
我该如何做到这一点?
答案 0 :(得分:3)
你无法从类方法中访问实例方法,为此,你应该实例化你正在使用的类(self)并访问该方法,例如:
def self.find(id)
self.new.initialize_parameters(id)
end
但是当你将initialize_parameters定义为私有方法时,访问它的方法是使用send来访问该方法并传递id参数:
def self.find(id)
self.new.send(:initialize_parameters, id)
end
private
def initialize_parameters(id)
@a = 1
@b = 2
end
或者只是将initialize_parameters更新为类方法,并删除不再需要的private关键字。
答案 1 :(得分:1)
此:
class Document
attr_accessor :a, :b
def self.find(id)
initialize_parameters(id)
end
end
不是试图从实例方法"访问类方法"正如你的标题所述。它试图从类方法访问(不存在的)类方法。
塞巴斯蒂安所说的一切都是现实。
然而,我想我会问:'你真正想做什么?'为什么当ruby已经为您提供initialize_parameters
时,您可以initialize
覆盖您心中的内容? IMO,它看起来应该更像:
class Document
attr_accessor :a, :b, :id
class << self
def find(id)
new(id).find
end
end
def initialize(id)
@a = 1
@b = 2
@id = id
end
def find
# if you want you can:
call_a_private_method
end
private
def call_a_private_method
puts id
end
end