如何在rails 3.2.12中为实例的方法定义一个单例方法?

时间:2013-03-31 21:33:50

标签: ruby-on-rails ruby singleton

在我们的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}}。

我们认为instancecustomer可能对此有所帮助。但我们不太明白他们将如何工作。有人能解释一下这个问题吗?谢谢你的帮助。

2 个答案:

答案 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