Ruby 正在验证用户输入的PIN
您将如何重构此代码,以检查用户是否添加了4位以上的PIN码,从而使代码尽可能短Ruby 正在验证用户输入的PIN,ruby,Ruby,您将如何重构此代码,以检查用户是否添加了4位以上的PIN码,从而使代码尽可能短 def has_pin? return self.pin.to_i > 1000 rescue nil false end 理想情况下,在用户创建时不使用AR验证,因为它们最初是在没有PIN的情况下创建的,但在某些特定情况下,可能会选择稍后添加它们 PS:由于某种原因,PIN被存储为字符串。我会选择: def pin_valid? pin.present? && pin.match
def has_pin?
return self.pin.to_i > 1000 rescue nil
false
end
理想情况下,在用户创建时不使用AR验证,因为它们最初是在没有PIN的情况下创建的,但在某些特定情况下,可能会选择稍后添加它们
PS:由于某种原因,PIN被存储为字符串。我会选择:
def pin_valid?
pin.present? && pin.match?(/\A\d{4,}\z/)
end
为什么您的目标是让代码尽可能短?我总是希望我的代码尽可能容易理解。我会选择:
def pin_valid?
pin.present? && pin.match?(/\A\d{4,}\z/)
end
为什么您的目标是让代码尽可能短?我总是希望我的代码尽可能容易理解。Pin不是数字,而是字符串。经验法则是:如果你不需要对它进行数学运算,不要将它存储为数字。使用RegExp匹配,也许--
self.pin=~/\d{4,}/
?另外,有_pin?
对于任何异常都应该返回false
,而您的代码返回nil
@31piypin.size>=4
:耸耸肩:保存pin时处理数字验证。@SergioTulentsev--同意!这应该是正确的方法。非常有效的评论。有些用户没有PIN设置tho,因此.size将抛出未定义的方法。其他人的手机里有一些字母,我想他们在手机上按数字的时间太长了,手机输入的是字母而不是数字。这必须是用户证明:)Pin不是数字,而是字符串。经验法则是:如果你不需要对它进行数学运算,不要将它存储为数字。使用RegExp匹配,也许--self.pin=~/\d{4,}/
?另外,有_pin?
对于任何异常都应该返回false
,而您的代码返回nil
@31piypin.size>=4
:耸耸肩:保存pin时处理数字验证。@SergioTulentsev--同意!这应该是正确的方法。非常有效的评论。有些用户没有PIN设置tho,因此.size将抛出未定义的方法。其他人的手机里有一些字母,我想他们在手机上按数字的时间太长了,手机输入的是字母而不是数字。这必须是用户证明:)“尽可能容易理解”-为此,可能将正则表达式提取到至少有数字(pin,4)的中,或者其他什么。也许只有我一个人,但我总是,总是被正则表达式绊倒。谢谢!费用呢?匹配正则表达式不会比.size或>1000贵一点吗?@NickM:是的,正则表达式比较慢。当你把它衡量为一个瓶颈时,你就会解决这个问题。我在高峰营业时间有超过1000-2000个房租,我负担不起这笔债务。虽然我这样问的原因主要不是性能,而是总体代码质量。@NickM:无论如何,不要做.to\u i>1000
。这完全是错误的。这里有一个将被拒绝的有效pin:0001
“尽可能容易理解”-为此,可能将正则表达式提取到一个至少有个数字(pin,4)的中。也许只有我一个人,但我总是,总是被正则表达式绊倒。谢谢!费用呢?匹配正则表达式不会比.size或>1000贵一点吗?@NickM:是的,正则表达式比较慢。当你把它衡量为一个瓶颈时,你就会解决这个问题。我在高峰营业时间有超过1000-2000个房租,我负担不起这笔债务。虽然我这样问的原因主要不是性能,而是总体代码质量。@NickM:无论如何,不要做.to\u i>1000
。这完全是错误的。以下是将被拒绝的有效pin:0001