我刚刚为我的模型调试了验证函数,并遇到了我无法理解的行为
因此,模型有一个字段address
,我使用自定义函数进行验证。
首先,我写了这样的代码
puts address
if address[0..3] != 'rtmp'
address = "rtmp://#{address}"
end
puts address
输出结果为:
"abc"
""
我的意思是第二个puts
输出空字符串。
然后我用此替换代码(每次调用self.
时添加address
)
放地址
puts self.address
if self.address[0..3] != 'rtmp'
self.address = "rtmp://#{self.address}"
end
puts self.address
这完全符合我的预期,输出
"abc"
"rtmp://abc"
有什么问题?我认为在这种情况下address
和self.address
是相同的。但事实并非如此。
答案 0 :(得分:0)
这种行为是因为在模型中 设置 属性时,如address = "rtmp://#{address}"
您正在创建一个局部变量
(在方法范围内)并且当方法结束时将消失。 get 属性不会发生这种情况,因为该程序
不会在最本地范围内找到变量,然后会查看模型的范围,并找到属性address
。
因此,对于教育行为者,你应该尝试这样的事情:
puts address
if address[0..3] != 'rtmp'
address = "rtmp://#{address}"
puts address #to print the local variable
end
puts address #to print the Attribute
自己检查一下这种行为。
但你的方法应该是:
puts address
if address[0..3] != 'rtmp' #without self because is get
self.address = "rtmp://#{address}" #with self because is set
end
puts address