我有几个不同的字段,它们将不同的电话号码以字符串形式存储在我的rails应用程序中。我可以使用带有正则表达式的内置rails格式验证器。有没有一种方法可以将该表达式放在帮助我的所有电话号码的辅助方法中,而不必打开每个模型文件并粘贴表达式字符串。
答案 0 :(得分:2)
添加自定义验证程序app / validators / phone_validator.rb
class PhoneValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value.to_s =~ /YOUR_REGEX_HERE/
record.errors.add attribute, 'must be a valid phone number'
end
end
end
然后在您的模型中
class MyModel < ApplicationRecord
#phone: true tells it to use the PhoneValidator defined above
validates :phone_number, presence: true, phone: true
end
答案 1 :(得分:1)
您可以从application.rb中获取任何文件:
# application.rb
require Rails.root.join "lib", "regexes.rb"
# lib/regexes.rb
PHONE_NUMBER_REGEX = /your regex/
然后,您只需在需要的地方使用常量
您也可以使用Rails的内置自动加载功能,例如,使用关注方法来布置其他注释器-默认情况下,关注文件是自动加载的,模型,控制器等也是
加载自定义文件而不是使用Rails的默认设置似乎不是惯用的或“ rails方式”。但是,我确实很重要,要了解您可以加载所需的任何文件。有些人会自动加载整个lib/
文件夹和子文件夹(请参见Auto-loading lib files in Rails 4)
另一种替代方法是将代码放置在config/initializers
文件夹中的某个位置,这些文件在启动时自动加载,您可以在其中定义共享的类/模块/常量。
答案 2 :(得分:0)
执行此操作的一种方法是创建一个关注点,该关注点将包含在具有电话号码的每种型号中。在models/concerns
中,创建一个名为phonable.rb
之类的新文件。
# models/concerns/phonable.rb
module Phonable
extend ActiveSupport::Concern
VALID_PHONE_REGEX = /\A\+?\d+\z/ # Use your regex here
end
现在包括这样的关注点:
# models/my_model.rb
class MyModel < ApplicationRecord
include Phonable
validates :phone, format: {with: VALID_PHONE_REGEX}
...
end
现在您有了一个Phonable
的问题,您也可以在这里放置任何其他与电话号码相关的逻辑,例如解析等。这种方法的优势在于,您与电话号码相关的所有逻辑都可以在需要它的模型中使用,而这些逻辑都不在不需要它的模型中可用。
答案 3 :(得分:0)
您可以将其放入ApplicationRecord(application_record.rb)
True
然后您可以在继承了ApplicationRecord的任何模型中使用它