我想检查基本上是用户输入的变量是否是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
。有很多堆栈溢出应答处理不同的问题,但想知道为什么我的代码不起作用。
答案 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