在我们的rails 3.2.12应用程序中,我们希望将一个方法readonly注入instance
的方法,以便将列标记为readonly
。理想情况下,我们可以为应用中每个readonly
的{{1}}的所有方法定义一个通用方法instance
。
例如,model
是@project
的一个实例。 Project model
中有一个phone#
。方法注入后,我们可以在运行时评估@project
(true或false)。如果应用中有另一个模型@project.phone.readonly
,我们可以customer
假设@customer.name.readonly
是@customer
的{{1}}。
我们认为instance
和customer
可能对此有所帮助。但我们不太明白他们将如何工作。有人能解释一下这个问题吗?谢谢你的帮助。
答案 0 :(得分:1)
http://apidock.com/ruby/Object/define_singleton_method阅读本文
但我认为这是个坏主意,因为你的一些属性(电话,名称等)可能是不可变或冻结的对象之一,因此会导致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)
同时检查一下 http://apidock.com/rails/ActiveRecord/ReadonlyAttributes/ClassMethods/attr_readonly https://github.com/rails/rails/blob/master/activerecord/lib/active_record/readonly_attributes
它允许您在初始化程序中执行类似的操作
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
如果不需要attr_readonly functionallity,那么在创建对象后不允许更改readonly属性,你可以使用另一个class_attribute变量创建自己的模块。
答案 1 :(得分:1)
@ user938363如果您需要定义一个方法一次并从任何实例调用它,那么您应该在类中定义该方法,而不是单身实例。
class Float
def readonly?
true
end
end
n = 1.234
n.readonly? # => true