Ruby on rails Ruby:验证给定的用户输入是否为数字
我想检查基本上是用户输入的变量是否是10位数的电话号码 有两组验证: -如果num小于10位,则提示消息 -如果num是字符串而不是整数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"
@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,则不相关,但我会这样做!