不要在插入

时间:2017-05-24 19:40:35

标签: ruby-on-rails ruby

我有一个模型user,其中包含以下方法:

  def number_with_hyphen
    number&.insert(8, "-")
  end

当我在测试中多次运行时,我得到以下输出:

users(:default).number_with_hyphen
"340909-1234"
(byebug) users(:default).number_with_hyphen
"340909--1234"
(byebug) users(:default).number_with_hyphen
"340909---1234"
(byebug) users(:default).number_with_hyphen
"340909----1234"

它更改了number以下是文档https://apidock.com/ruby/v1_9_3_392/String/insert

当我将我的方法重组为:

  def number_with_hyphen
    "#{number}".insert(8, "-") if number
  end

如果像预期的那样工作。输出保持不变!

您将如何构建代码,如何执行插入? 我应该使用哪种方法。感谢

2 个答案:

答案 0 :(得分:2)

如果您正在使用insert方法,该方法在文档中明确指出"修改 str ",那么您将需要避免这样做两次,使其幂等,或使用另一种不会破坏数据的方法。

一种方法是使用简单的正则表达式来提取您感兴趣的组件,忽略已存在的任何短划线:

def number_with_hyphen
  if (m = number.match(/\A(\d{8})\-?(\d+)\z/))
    [ m[1], m[2] ].join('-')
  else
    number
  end
end

最终真的很安全。如果修改为接受参数,则可以测试:

number = '123456781234'

number_with_hyphen(number)
# => "12345678-1234"
number
# => "123456781234"
number_with_hyphen(number_with_hyphen(number))
# => "12345678-1234"
number_with_hyphen('1234')
# => "1234"

调用它两次并不会破坏任何东西,任何不符合要求的数据都会按原样发送。

答案 1 :(得分:0)

克隆字符串:

"#{number}".clone.insert(8, '-')