代码:
puts "params[:phone] is " + params[:phone]
ph = params[:phone].gsub!(/\D/,'')
Rails.logger.info("ph is now " + ph + "\r\n")
Rails控制台:
params [:phone]是808XXXXXXX< - (删除隐私权) 在2383ms完成500内部服务器错误
TypeError(没有将nil隐式转换为String): app / controllers / api_controller.rb:400:在`+'
这意味着'ph'是零。
WUT?
同样的gsub!(/ \ D /,'')部分已经工作了近一年,剥离了连字符,空格,括号等。
现在它想彻底剥离一切。
我不明白。
编辑:
当我使用它时:
ph = params[:phone].gsub(/\D/,'')
我得到了我期望的结果,有和没有数字(例如“8084445555”或“808-444-5555”我得到的结果“8084445555”)
但我仍然想知道原因。 GSUB!将取代params [:phone],我明白了,但它不应该剥离非数字,它就是。
答案 0 :(得分:3)
以下是答案:
如果原始字符串与任何内容不匹配, gsub
将返回该字符串。另一方面,gsub!
会在这种情况下返回nil
。
如果两个方法匹配,它们将返回包含替换的字符串,并且没有任何特殊之处,除了gsub!
将修改接收器对象,因为您应该已经知道。
以下是一些说明事实的例子。特别注意主题和返回的值。如果需要,您可以在 irb 中尝试以下操作。
phone_number = "888-555-0110" #=> "888-555-0110"
stripped_pn = phone_number.gsub(/\D/, '') #=> "8885550110"
phone_number #=> "888-555-0110"
stripped_pn.gsub(/\D/, '') #=> "8885550110"
以下是与gsub!
相同的示例:
phone_number = "888-555-0110" #=> "888-555-0110"
stripped_pn = phone_number.gsub!(/\D/, '') #=> "8885550110"
phone_number #=> "8885550110"
stripped_pn.gsub!(/\D/, '') #=> nil