2013-03-31 38 views
2

在我們的rails 3.2.12應用程序中,我們想要只注入一個方法instance的方法來標記一個列爲readonly或不是。理想情況下,我們可以爲應用中每個modelinstance的所有方法定義一個通用方法readonly如何在rails 3.2.12中爲一個實例的方法定義一個單例方法?

例如,@projectProject model的一個實例。 @project中有phone#。方法注入後,我們可以在運行時評估@project.phone.readonly(true或false)。如果應用中有另一款customer,我們可以做@customer.name.readonly,假設@customercustomerinstance

我們覺得singleton classdefine_method可能有幫助。但我們不太明白他們將如何工作。有人可以解釋這個問題嗎?謝謝您的幫助。

回答

1

@ user938363如果您需要定義一個方法一次和任何例如調用它,那麼你應該在定義的類的方法,而不是在單個實例。

class Float 
    def readonly? 
    true 
    end 
end 

n = 1.234 
n.readonly? # => true 
+0

這不是實例方法,而是類方法...只讀? ==對於所有花車都是如此 – Fivell

1

http://apidock.com/ruby/Object/define_singleton_method閱讀本

但我認爲這是壞主意,因爲你的一些屬性(電話,姓名等)可以是不可變的或冰凍的對象之一,所以它會導致類型錯誤

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,不允許以只讀屬性更改已創建,您可以像這樣創建自己的模塊,但可以使用另一個class_attribute變量。

+0

immutable或frozen會是問題。某些數據類型(如float和integer)的對象是不可變的還是天生的? @ project.readonly?(:phone)在我們的應用程序中可以。有沒有辦法我們可以定義一次並從任何實例中調用? – user938363

+0

是的,他們是天生不變的,他們也是從紅寶石凍結的2.0 – Fivell

相關問題