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

Ruby on rails Ruby:验证给定的用户输入是否为数字,ruby-on-rails,ruby,validation,int,Ruby On Rails,Ruby,Validation,Int,我想检查基本上是用户输入的变量是否是10位数的电话号码 有两组验证: -如果num小于10位,则提示消息 -如果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"

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

有两组验证: -如果num小于10位,则提示消息 -如果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
我得到的输出总是
无论我在文本框中输入什么,数字都是无效的。有很多堆栈溢出,回答不同的问题,但不知道为什么我的代码不起作用

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

代码总是返回到
else
部分的原因是来自
参数的值总是字符串。因此,
params[:phone_num]
的值是一个字符串。因此,如果@phone.is_a,您的代码在此失败
?整数
。相反,您需要将其更改为
params[:phone\u num].to\u 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的问题。

看看这个--如何确定字符串看起来像电话号码。有一个非常复杂的正则表达式,因为人们输入电话号码的形式多种多样

我个人不喜欢超复杂的正则表达式,但这正是它们被发明的目的。因此,这就是你想要弄清楚什么样的表单是可以接受的,编写一些测试,并基于上面的大量链接使你的代码通过你的验收

编辑:你的代码在很多地方都是错误的;参数已经是一个字符串,请尝试此操作!还记得嵌套的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

这方面有标准验证()&():

#app/models/user.rb
class User < ActiveRecord::Base
   validates :phone_num, length: { is: 10 }, numericality: { only_integer: true }
end
#app/models/user.rb
类用户
这种类型的验证属于模型


注释

您的控制器将如下所示:

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   def create
      @user = User.new user_params
      @user.save #-> validations handled by model
   end
end
#app/controllers/users_controller.rb
类UsersController由模型处理的验证
结束
结束
有一个原则叫做——你应该在你的模型中加入“数据”逻辑

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

它使您能够将大部分逻辑委托给Rails核心助手(例如,
验证
),而不是在前端调用自己的大量代码(就像您正在做的那样)

每次运行Rails应用程序时,各种类(控制器和模型)都会加载到内存中。除了所有Rails类(
ActiveRecord
etc)之外,还必须加载控制器和模型


任何额外的代码都会导致应用程序出现错误&无法使用。最好的开发人员知道何时使用自己的代码,何时委托给Rails。这个例子完美地演示了何时授权。

可能重复@BradWerth我想了解为什么我的程序不工作,而不是复制其他程序的代码fwiw,参数都是stings。当插入数据库时,它们被强制转换为整数。因此,从现有问题中学习,它已经被询问(并回答)…或FWIW,转换为整数、检查是否为整数、转换为字符串以及检查长度似乎有点愚蠢。这也是在Rails中执行验证的一种糟糕的方法。@BradWerth您认为更好的方法是什么&堆栈溢出只允许我在一定时间内接受答案,所以等待时间的流逝by@fscoreRails验证。比如或者也许……或者@fscore感谢Rich。这是一个很好的例子,我会怎么做,因为在我的场景中没有模型。我不想储存任何东西。尽管存储可以让前进变得非常有意义。但是,如果没有模型,我想知道另一个最佳实践,通过模型代码,我想查看不同类型的消息。您的示例如何可能只在模型中进行验证?@fscore您仍然可以使用验证,而无需持久化到数据库,您可以创建一个不从任何内容继承的类。将一组功能和逻辑包装到一个新类中是高级内容,并包含在以下内容中:,如果您希望人们能够输入电话号码,如
(710)123-3456
,那么验证数字性将不起作用;在写入时,您需要预处理数字-可能
defnumber=(val);写入属性:val,val.gsub/\D/,'';结束--如果不使用db,则不相关,但我会这样做!