Ruby on rails 轨道改变了?方法总是错误的

Ruby on rails 轨道改变了?方法总是错误的,ruby-on-rails,Ruby On Rails,我正在尝试在我的模型中检查复选框值是否已更改。如果它被更改,我希望我的方法set\u ip\u setting在保存之前在中运行,但是我的x变量总是返回为false,即使我更改了值。为什么它总是假的?我看不出我做错了什么 before_save :set_ip_setting, if: :check_my_ip 已编辑 通过使用以前的更改方法,我得到了我想要的结果,但我认为有一种更干净的方法,但以下是对我有效的方法 def check_my_ip x = self.sip.prev

我正在尝试在我的模型中检查复选框值是否已更改。如果它被更改,我希望我的方法
set\u ip\u setting
在保存之前在
中运行,但是我的
x
变量总是返回为false,即使我更改了值。为什么它总是假的?我看不出我做错了什么

before_save :set_ip_setting, if: :check_my_ip
已编辑 通过使用
以前的更改
方法,我得到了我想要的结果,但我认为有一种更干净的方法,但以下是对我有效的方法

  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

如果x==true,则通常不编写
。在Ruby中,
true
false
是不同的值。例如,
1==true
false

相反,只需检查
if x
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

如果x==true,则通常不编写
。在Ruby中,
true
false
是不同的值。例如,
1==true
false

相反,只需检查
if x
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

这是什么?
my_ip_changed?
方法?在传递复选框值时,你能给我们显示模型类和控制器吗?@jvillian,看起来模型有一个
my_ip
列,这是利用ActiveModel::Dirty@kbob的方法,你有没有尝试在方法中编写puts语句来确认错误是x为false,并不是说您的条件的行为与预期的不同?@ianroot我在调试语句中加入了
Rails.logger.debug“option”{x}
,这确认了它总是错误的,我没有把它们包括在这里,因为我认为这个问题不需要这个
my_ip_changed?
方法是什么?你能在传递复选框值时向我们展示模型类和控制器吗?@jvillian,看起来模型有一个
my_ip
列,这是利用ActiveModel::Dirty@kbob中的方法,您是否尝试过在方法中编写puts语句来确认错误是x为false,而不是您的条件的行为与预期不同?@ianroot我已在调试语句
Rails.logger.debug“option#{x}”
中添加了puts语句,确认它始终为false,我没有把它们包括在这里,因为我不认为这个问题需要它。谢谢你,但这并不能解释或告诉我为什么我的
x
总是
false
,这就是问题所在。@kbob如果没有看到
我的知识产权发生了变化?
以前的变化
我就不能告诉你,一般来说是什么
self.sip
is.yes,我想我们需要了解更多关于表单和模型的信息才能找到问题谢谢,但这并不能解释或告诉我为什么我的
x
总是
false
,这就是问题所在。@kbob如果不看到
my\u ip\u更改?
以前的更改,我就不能告诉你,通常是什么
self.sip
是。是的,我认为我们需要了解更多关于表单和模型的信息才能找到问题