模型验证中的变量范围

时间:2017-05-18 13:15:11

标签: ruby-on-rails

我刚刚为我的模型调试了验证函数,并遇到了我无法理解的行为 因此,模型有一个字段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"

有什么问题?我认为在这种情况下addressself.address是相同的。但事实并非如此。

1 个答案:

答案 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