Ruby:验证给定的用户输入是否为数字

时间:2015-10-28 05:51:30

标签: ruby-on-rails ruby validation int

我想检查基本上是用户输入的变量是否是10位数的电话号码。

有两组验证: - 如果num小于10位,则提示msg - 如果num是一个字符串而不是整数

@phone = params[:phone_num]
    puts "phone_num: #{@phone}"
    if @phone.is_a? Integer 
      puts "phone_num is int"
      if @phone.to_s.length == 10
        puts "10 digit"
        perform(@phone)
        @output = "Valid Number, will receive a call"
      end
    else 
      puts "Wont be calling"
      @output = "The number is invalid"
    end

无论我在文本框中输入什么,我得到的输出始终为The number is invalid。有很多堆栈溢出应答处理不同的问题,但想知道为什么我的代码不起作用。

3 个答案:

答案 0 :(得分:2)

有标准验证(length)& (numericality)为此:

#app/models/user.rb
class User < ActiveRecord::Base
   validates :phone_num, length: { is: 10 }, numericality: { only_integer: true }
end

此类验证属于模型。

备注

您的控制器将如下所示:

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   def create
      @user = User.new user_params
      @user.save #-> validations handled by model
   end
end

有一个名为fat model, skinny controller的原则 - 你应该把&#34;数据&#34;模型中的逻辑。

这样做的原因是从控制器中删除低效的代码。

它使您能够大部分逻辑委派给Rails核心助手(例如validations),而不是在前端调用自己的大量代码(像你一样)。

每次运行Rails应用程序时,各种类(控制器和模型)都会加载到内存中。除了所有的Rails类(ActiveRecord等),您的控制器和&amp;模型也必须加载。

任何额外代码都会导致bloat原因,导致您的应用程序错误。无法使用。最好的开发人员知道何时使用自己的代码,何时委托给Rails。这个例子很好地展示了何时委派。

答案 1 :(得分:1)

  

我得到的输出总是无论我是什么,数字都是无效的   在文本框中输入。

您的代码始终回退到else部分的原因是因为来自params的值始终为 字符串 。因此params[:phone_num]的值是 字符串 。所以你的代码在if @phone.is_a? Integer失败了。相反,您需要将其更改为params[:phone_num].to_i

@phone = params[:phone_num].to_i
puts "phone_num: #{@phone}"
  if @phone.is_a? Integer 
    puts "phone_num is int"
    if @phone.to_s.length == 10
      puts "10 digit"
      perform(@phone)
      @output = "Valid Number, will receive a call"
    end
  else 
    puts "Wont be calling"
    @output = "The number is invalid"
  end

注意:

是。这是执行验证的糟糕方法。我只是在回答OP的问题。

答案 2 :(得分:0)

看看这个 - A comprehensive regex for phone number validation - 如何确定字符串看起来像电话号码。这是一个非常复杂的正则表达式,因为人们有各种形式来输入电话号码!

我个人不喜欢超级复杂的正则表达,但它几乎就是它们的发明。所以这就是你想要弄清楚哪种形式是可以接受的,写一些测试,并根据上面的大量链接让你的代码通过你的接受!

编辑:你的代码在很多地方都是错误的; params已经是一个字符串,所以试试吧!记住你的嵌套if / else / end。

@phone = params[:phone_num]
if @phone =~ /\A\d+\Z/ # replace with better regex
  # this just means "string is all numbers"
  puts "phone_num is int"
  if @phone.length == 10
    puts "10 digit"
    perform(@phone)
    @output = "Valid Number, will receive a call"
  else
    puts "Number length wrong, #{@phone.length}"
  end
else 
  puts "Wont be calling, not a number: #{@phone.inspect}"
  @output = "The number is invalid"
end