2011-04-04 42 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