2016-07-07 60 views
2

我試圖根據其順序屬性中的值向類公開一些方法,可能類似於['top', 'bottom', 'right', 'lower-right']Ruby:基於模型屬性的元編程方法

首先,我班從陣列任何響應空白像這樣刪除:

def order 
    order.split(' ').delete_if do |o| 
    send(o).blank? if respond_to? o 
    end 
end 

在那之後,我要「揭發」 top(例如的緣故),作爲類中的方法。

order.each do |o| 
    V1_ATTRIBUTES << o.to_sym 
    define_method(o) do |a| 
    send(a).blank? ? '' : send(a) 
    end 
end 

o上課的時候不instantialised,一拉沒有定義:

<NameError: undefined local variable or method `o' for #<Class:#<APIDocument:0x007fb8123609f8>>> 

任何人有一個更好的取得任何成功,我在initialize方法嘗試這樣的東西方法來獲得這個結果?

注意:我知道允許用戶編寫實例方法名稱並不是很好的做法,但在這種情況下,安全和破壞不是問題。

+0

實現方法'order'時是否存在無限遞歸? – Aetherus

+0

不,這個帖子被簡化了。 :) –

回答

2

您可以定義單例方法(每個對象的方法)。

def order 
    orders.split(' ').map{|o| send(o)}.compact.each do |o| 
    singleton_class.send(:define_method, o) do 
     send(o).to_s 
    end 
    end 
end 

但是,正如你所看到的,這隻會弄亂你的代碼。所以不要濫用元編程,明智地使用它。

+0

啊!單例方法。謝謝! –