2011-04-04 79 views
1

我想使用自定義設置器來對字段進行一些格式設置。在irb中,如果我測試setter:如何訪問我覆蓋的Activerecord setter?

o.field_name = "4" 

我看到我的自定義setter被引用。但是,與此是不:

o[:field_name] = "4" 

據我所知,在第一種情況下,這是一個函數調用,並在第二種情況下,我們只是直接設置屬性。但是我沒有完全看到如何通過我們的自定義設置器來設置屬性,我認爲這是關鍵。

但我的主要問題是,如果var擁有我的field_name,我看不到如何動態引用a.var並將其解釋爲a.field_name。我所看到的只是一個[var],這繞過了我的制定者。

回答

2

嘗試a.send(var)其中var = 'field_name'

這就是a.field_name

+0

啊,所以這個問題問的是什麼? :O + 1確實是多才多藝的。另外請看一下eval進行動態評估。 – Spyros 2011-04-04 04:50:21

+0

啊我需要檢查!ruby對象頁面,那裏有很多功能,我錯過了。但用法似乎是:a.send var.to_sym val這給我一個運行時錯誤,而a.send(var.to_sym)= val給我一個語法錯誤。我不知道,我即將放棄這個設置者作爲格式化員的想法。 – 2011-04-04 15:30:58

+0

這不應該給你一個錯誤。val是零或什麼的。順便說一句,你不需要調用to_sym,send可以處理純字符串。 – 2011-04-04 17:32:51

0

o [:field_name]類似於read_attribute(:field_name),因此只是按照您所說的讀取值。它在虛擬屬性中可能非常重要,以避免堆棧太深的錯誤。如果你做一個[:var],你只需要它的價值。虛擬屬性是指一個屬性,如果您將其值設置爲另一個變量,您只需獲取其值,而不是對象。

+0

相當於我很困惑,我能夠通過使用[VAR] =「VAL」其中var = FIELD_NAME,它只是繞過設置的值二傳手。肯定有辦法讓我不要繞過二傳手? – 2011-04-04 02:39:52

+0

a.fieldname =「val」不應該繞過setter。 – Spyros 2011-04-04 03:04:06

+0

但我的問題的整個觀點是,fieldname實際上是一個變量,它擁有說first_name,所以a.fieldname不會翻譯成a.first_name – 2011-04-04 03:06:35