2014-10-07 43 views
0

我正在尋找一種方法來從字符串中分配模型屬性。這是在具有不同屬性的多個模型共享的關注之內,所以我不能僅僅強制給屬性名稱編碼。從字符串中分配模型屬性的替代方法

我在使用一個字符串沒有問題檢索屬性「發送」:

self.send("#{attribute_name}") 

,但我有難度指定字符串中的屬性。 E.g

self."attribute_name" = "<user input>" 

可怕的eval函數做什麼,我需要的,但它顯然是可怕的不安全:

eval("self.#{attribute_name} = '<user input>'") 

有我缺少的是可以實現這個沒有的eval函數?或者我的方法都是錯誤的,我應該回到製圖板?謝謝。

回答

1

鑑於該屬性具有公共setter方法,這個工程:

class X 
    attr_accessor :foo 

    def dynamic_set(attr_name, value) 
    public_send("#{attr_name}=", value) 
    end 
end 

x = X.new 
x.dynamic_set("foo", "bar") 
p x.foo 
# => "bar" 
+0

真棒正是我需要的 - 太感謝你了! – RichardAE 2014-10-07 12:42:49

+1

請注意,如果方法不存在或不公開,public_send會引發異常。 – Jesper 2014-10-07 12:44:48

+1

剛剛看到您的編輯 - 這看起來像一個偉大的實施,再次感謝!當它讓我(顯然是7分鐘)時,我將它標記爲答案。 – RichardAE 2014-10-07 12:45:53

1

你應該把它們保存爲實例變量。

要獲取:

instance_variable_get("@#{attribute_name}") 

設置:

instance_variable_set("@#{attribute_name}", user_input) 
+0

這不是不明智的,因爲用戶可以用這種方式設置一個任意的實例變量嗎?所以你可以通過將大量的實例變量設置爲非常大的字符串值來攻擊系統? – Jesper 2014-10-07 13:16:57

+0

@Jesper OP寫道:「我不能硬編碼屬性名稱。」如何在不違反此要求的情況下做到這一點? – sawa 2014-10-07 13:18:56

+0

是的,我錯過了。但是,從我的回答被接受以來,OP似乎並不完全是指他或她寫了什麼。 – Jesper 2014-10-07 13:39:32

相關問題