Ruby on rails 模型验证中的可变范围

Ruby on rails 模型验证中的可变范围,ruby-on-rails,Ruby On Rails,我刚刚为我的模型调试了一个验证函数,面临着我无法理解的行为 所以,模型有一个字段address,我使用自定义函数对其进行验证。 首先,我写了这样的代码 puts address if address[0..3] != 'rtmp' address = "rtmp://#{address}" end puts address 结果是: "abc" "" 我的意思是第二个将输出空字符串 然后我用这个替换了代码(每次调用地址时都添加了self.) 放置地

我刚刚为我的模型调试了一个验证函数,面临着我无法理解的行为 所以,模型有一个字段
address
,我使用自定义函数对其进行验证。 首先,我写了这样的代码

    puts address
    if address[0..3] != 'rtmp'
      address = "rtmp://#{address}"
    end
    puts address
结果是:

"abc"
""
我的意思是第二个
输出空字符串

然后我用这个替换了代码(每次调用
地址时都添加了
self.
) 放置地址

puts self.address    
if self.address[0..3] != 'rtmp'
  self.address = "rtmp://#{self.address}"
end
puts self.address
这正是我所期望的,输出

"abc"
"rtmp://abc"

有什么问题吗?我想在那种情况下,
address
self.address
是一样的。但事实并非如此

这种行为是因为在模型中,当一个集合一个属性时,比如
address=“rtmp://{address}”
您正在创建一个局部变量 (在该方法的范围内)并且当该方法结束时,该选项将失效。这不会发生在获取属性时,因为程序 在most local范围内找不到变量,然后在模型范围内查找,然后在那里找到您的属性
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

是的,这正是我所期望的。但我仍然不明白为什么它会创建一个局部变量。每次我尝试使用
=
为属性赋值时,它都会这样做,而不是使用
self调用它。
?它总是这样解释这样的表达式?这就是Ruby的工作原理,局部范围优先。好的。我懂了。非常感谢。这可能有点奇怪,但随着时间的推移,你会习惯的。