Ruby on Rails覆盖更改哈希中的值

时间:2013-03-14 17:05:09

标签: ruby-on-rails ruby

我正在尝试添加一个before_validation挂钩来清理无关的空白区域。作为其中的一部分,我还想将任何空字符串值设置为零。这样做的原因是为了防止用户将空白空间输入必需字段以试图绕过它。

以下是我尝试这样做的方法。变化[x] [1] .strip!线路按照我的预期工作,并给了我一个空白线。我发现令人惊讶的是,在我尝试设置更改[x] [1] = nil时,更改[x] [1]的值保持不变。通过一些调试测试,我发现不仅失败了,而且任何将更改[x] [1]设置为ANY值的尝试都无法实际更新数组!

我很想听听我在这里做错了什么,以及如何解决它。非常感谢!

def strip_whitespace
  changes.keys.each do |x|
    if changes[x][1].respond_to?(:strip!)
      changes[x][1] = nil if changes[x][1].blank?
      changes[x][1].strip!
    end
  end
end

1 个答案:

答案 0 :(得分:0)

您不需要执行所有这些检查,.blank?方法在对象时返回true:

  • nil
  • 是一个空字符串
  • 是一个只包含空格字符的字符串。

:presence验证使用blank?方法,因此您可以使用该方法来防止在模型的属性中引入空字符串。

修改

我尝试重现你创建changes哈希的上下文,它运行得很好:

changes = {one: ['q', 'w', 'e'], two: ['a', '', 'd']}

changes.keys.each do |x|
  changes[x][1] = nil if changes[x][1].blank?
end
# => [:one, :two]

changes
# => {:one => ["q", "w", "e"], :two => ["a", nil, "d"]}