Ruby on rails 如何在rails 3.2.12中为实例的方法定义一个只读的单例方法?
在rails 3.2.12应用程序中,我们希望向Ruby on rails 如何在rails 3.2.12中为实例的方法定义一个只读的单例方法?,ruby-on-rails,ruby,singleton,Ruby On Rails,Ruby,Singleton,在rails 3.2.12应用程序中,我们希望向实例的方法注入一个readonly方法,以将列标记为readonly。理想情况下,我们可以为应用程序中每个模型的实例的所有方法定义一个通用方法readonly 例如,@project是项目模型的一个实例。在@项目中有一个电话#。在方法注入之后,我们可以在运行时评估@project.phone.readonly(true或false)。如果应用程序中有另一个型号客户,我们可以执行@customer.name.readonly假设@customer是客
实例的方法注入一个readonly方法,以将列标记为readonly
。理想情况下,我们可以为应用程序中每个模型的实例的所有方法定义一个通用方法readonly
例如,@project
是项目模型的一个实例。在@项目
中有一个电话#
。在方法注入之后,我们可以在运行时评估@project.phone.readonly
(true或false)。如果应用程序中有另一个型号客户
,我们可以执行@customer.name.readonly
假设@customer
是客户
的实例
我们觉得singleton类
和define\u方法
在这里可能会有所帮助。但我们不太明白它们将如何运作。有人能解释一下这个问题吗?谢谢你的帮助。读一下这个
但我认为这是个坏主意,因为您的某些属性(电话、姓名等)可能是不可变或冻结的对象之一,因此会导致TypeError
范例
1.9.3p125 :001 > number = 5.34
=> 5.34
1.9.3p125 :002 > def number.readonly?
1.9.3p125 :003?> true
1.9.3p125 :004?> end
TypeError: can't define singleton method "readonly?" for Float
我建议你考虑下一个界面
@project.readonly?(:name)
也检查一下这个
它允许您在初始值设定项中执行类似的操作
class ActiveRecord::Base
def attr_readonly?(attr_name)
self.class.readonly_attributes.include(attr_name)
end
end
然后
class Phone < ActiveRecord::Base
attr_readonly :phone
end
class电话
如果不需要attr_readonly功能,即不允许在创建对象后更改readonly属性,您可以像这样创建自己的模块,但使用另一个class_属性变量。@user938363如果您需要定义一次方法并从任何实例调用它,那么您应该在类中定义该方法,不在单例实例中
class Float
def readonly?
true
end
end
n = 1.234
n.readonly? # => true
不可变或冻结将是一个问题。某些数据类型(如float和integer)的对象本质上是不可变的还是fronzen的@project.readonly?(:phone)可以在我们的应用程序中使用。有没有一种方法可以定义它一次并从任何实例调用它?是的,它们本质上是不可变的,而且它们是从ruby 2.0中冻结的,这不是实例方法,而是类方法。。。只读?==适用于所有浮动