我试图创建一个具有私有类方法的类.我希望这个私有类方法可用于实例方法.
以下是我的第一次尝试:
class Animal
class << self
def public_class_greeter(name)
private_class_greeter(name)
end
private
def private_class_greeter(name)
puts "#{name} greets private class method"
end
end
def public_instance_greeter(name)
self.class.private_class_greeter(name)
end
end
Run Code Online (Sandbox Code Playgroud)
Animal.public_class_greeter('John')工作正常,印刷John greets private class method.
但是,Animal.new.public_instance_greeter("John")抛出一个错误:NoMethodError: private method 'private_class_greeter' called for Animal:Class.
这是预期的,因为调用self.class.private_class_greeter是相同的Animal.private_class_greeter,这显然会引发错误.
在搜索了如何解决这个问题之后,我想出了以下代码:
class Animal
class << self
def public_class_greeter(name)
private_class_greeter(name)
end
private
def private_class_greeter(name)
puts "#{name} greets private class method"
end
end
define_method :public_instance_greeter, &method(:private_class_greeter)
end
Run Code Online (Sandbox Code Playgroud)
我不太清楚这里发生了什么:&method(:private_class_greeter).
你能解释一下这是什么意思吗? …
更新: Rails 3.2 中不再存在此问题
我正在尝试获取一个包含 Rails 3 应用程序中所有模型的数组。我在尝试:
ActiveRecord::Base.send(:descendants)
Run Code Online (Sandbox Code Playgroud)
对于相同的。类似的讨论发生在以下问题中:是否有一种方法可以获取 Rails 应用程序中所有模型的集合?。正如其中一个答案所指出的,我们需要触摸模型才能显示模型。这正是我面临的问题。
我的 Rails 应用程序中有十几个模型,但是
ActiveRecord::Base.send(:descendants)
Run Code Online (Sandbox Code Playgroud)
返回一个大小为 2 的数组。该数组只有 User 和 ActiveRecord::SessionStore::Session 模型。在我通过触摸触摸模型之前,我不会获得其他模型,例如调用Comment.new
如何在不触摸所有模型的情况下获得列出的所有模型?
另一条可能有用的附加信息是我正在使用设备进行身份验证。就用户模型而言,也许设计正在以所需的方式做事,而我不会对其他模型做这些事情。
预先非常感谢。