我,如果一個屬性進行訪問其屬性沒有數據,從一個REST API動態加載數據的模型:如何在RubyOnRails中實現魔術功能?
class Issue
attr_accessor :ticket_title, :priority, :description
@ticket_title
@priority
@description
def priority
if [email protected]?
updateProperties()
end
@priority
end
def description
if [email protected]?
updateProperties()
end
@description
end
def ticket_title
if [email protected]_title.empty?
updateProperties()
end
@ticket_title
end
def updateProperties
# loads all data from REST API
end
def initialize (hsh = {})
hsh.each { |key, value|
self.instance_variable_set("@#{key}", value)
}
end
end
有兩個問題:
- 如果我初始化與模型
RedmineIssue.new :ticket_title => 'test'
,我不希望模型打電話給updateProperties
,但它不知道怎麼做。 - 有什麼辦法可以神奇地聲明函數嗎?也就是說,如果沒有真正的函數嘗試運行元函數?
你是什麼意思,「神奇」? – 2012-07-20 16:52:10
我試過'Issue.new:ticket_title =>'test'',它沒有調用'updateProperties'。還有別的東西你沒有顯示。 – 2012-07-20 16:53:47
如果我通過「神奇地」理解你的意思,你需要'method_missing'鉤子。順便說一下,你的初始化可能非常不安全,而且效率不高。使用'instance_variable_set'替換一個散列。 – Linuxios 2012-07-20 16:58:08