我正在尝试检查我的模型中复选框值是否已更改。如果改变了我想要我的方法set_ip_setting
跑进去before_save
but my x
即使我更改值,变量也总是返回 false。为什么它总是返回错误?我不明白我做错了什么
before_save :set_ip_setting, if: :check_my_ip
def check_my_ip
x = self.sip.my_ip_changed?
is_ip = self.sip.my_ip
if x == true && is_ip == true
return false
elsif x == false && is_ip == true
return false
elsif x == true
return true
end
end
def set_ip_setting
if self.sip.try(:my_ip) == true
sip.nat = "yes"
sip.invite = "yes"
end
end
EDITED我通过使用得到了我想要的结果previous_changes
方法,但我认为有一种更干净的方法,但这对我来说是有效的
def check_my_ip
x = self.sip.previous_changes[:my_ip]
off_to_on = [false, true]
on_to_off = [true, false]
is_ip = self.sip.my_ip ? 1 : 0
if x.nil? && is_ip == 1
return false
elsif x == on_to_off
return false
end
return true
end
一般情况下你不写if x == true
。在红宝石中,true
and false
是不同的价值观。例如,1 == true
is false
.
相反,只需检查if x
or if !x
.
def check_my_ip
# Note that an explicit `self` is not necessary except when setting a value.
x = sip.my_ip_changed?
is_ip = sip.my_ip
if x && is_ip
return false
elsif !x && is_ip
return false
elsif x
return true
end
end
def set_ip_setting
if self.sip.try(:my_ip)
sip.nat = "yes"
sip.invite = "yes"
end
end
您的逻辑可以简化,并使用隐式返回。
def check_my_ip
x = sip.my_ip_changed?
is_ip = sip.my_ip
if is_ip
false
elsif x
true
else
false
end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)