类中的实例变量未保存

我通过before_validation过滤我的PersonalInfo类的所有实例值,如下所示:

before_validation :strip_tabs def strip_tabs self.instance_variables.map do |attr| value = self.instance_variable_get(attr) if value.present? && value.kind_of?(String) encoding_options = { :invalid => :replace, # Replace invalid byte sequences :undef => :replace, # Replace anything not defined in ASCII :replace => '', # Use a blank for those replacements :universal_newline => true # Always break lines with \n } value = value.encode(Encoding.find('ASCII'), encoding_options) value = value.squish value = value.gsub("/t","") self.instance_variable_set(attr, value) end end end 

这段代码在这里讨论:

在validation之前循环通过自我属性进行修改

strip_tabs工作它转换为:“\ t•\ tzef”进入:“zef”

在我的测试用例中,我使用错误值(“\ t•\ tzef”)填写last_name,并在此处设置断点:

  def strip_tabs self.instance_variables.map do |attr| value = self.instance_variable_get(attr) if value.present? && value.kind_of?(String) encoding_options = { :invalid => :replace, # Replace invalid byte sequences :undef => :replace, # Replace anything not defined in ASCII :replace => '', # Use a blank for those replacements :universal_newline => true # Always break lines with \n } value = value.encode(Encoding.find('ASCII'), encoding_options) value = value.squish value = value.gsub("/t","") self.instance_variable_set(attr, value) end end binding.remote_pry end 

结果如预期正确:

在此处输入图像描述

现在是不起作用的重要部分:

代码启动是因为我这样做:

 info = PersonalInfo.new(params["personal_info"]) 

当它完成时,info.last_name仍然是坏值: 在此处输入图像描述

问题:为什么不保存instance_variables?

更多信息: – ‘rails’,’3.2.17’ – ruby​​ 1.9.3p484(2013-11-22修订版43786)[x86_64-darwin13.0.2]

你必须打电话

 info.valid? 

如果你没有直接保存info (这将隐式触发它),以触发validation挂钩。