如何在助手方法中存储正则表达式表达式字符串以用于验证几个不同的字段?

时间:2019-05-06 20:03:43

标签: ruby-on-rails ruby

我有几个不同的字段,它们将不同的电话号码以字符串形式存储在我的rails应用程序中。我可以使用带有正则表达式的内置rails格式验证器。有没有一种方法可以将该表达式放在帮助我的所有电话号码的辅助方法中,而不必打开每个模型文件并粘贴表达式字符串。

4 个答案:

答案 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的任何模型中使用它