Как я могу сохранить строку выражения регулярного выражения во вспомогательном методе, чтобы использовать его для проверки нескольких различных полей? - PullRequest
0 голосов
/ 06 мая 2019

У меня есть несколько разных полей, которые хранят разные телефонные номера в моем приложении rails в виде строки. Я могу использовать встроенный валидатор формата rails с выражением регулярного выражения. Есть ли способ поместить это выражение во вспомогательный метод для всех проверок моего телефонного номера вместо того, чтобы открывать каждый файл модели и вставлять строку выражения.

Ответы [ 4 ]

2 голосов
/ 06 мая 2019

Добавьте пользовательское приложение валидатора / 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 голос
/ 06 мая 2019

Вы можете запросить любой файл из application.rb:

# application.rb
require Rails.root.join "lib", "regexes.rb"

# lib/regexes.rb
PHONE_NUMBER_REGEX = /your regex/

Затем вы просто используете константу там, где это необходимо

Вы также можете использовать встроенную функцию автозагрузки Rails,например, с подходом к проблеме, изложенным в другом комментарии, файл по умолчанию автоматически загружается, как и модели, контроллеры и т. д.

Загрузка пользовательских файлов вместо значений по умолчанию в Rails может показаться нелогичной или "путь рельсов ".Тем не менее, я думаю, что важно понимать, что вы можете загружать любые файлы, которые вы хотите.Некоторые люди автоматически загружают всю папку lib/ и подпапки (см. Автоматическая загрузка файлов lib в Rails 4 )

Другой альтернативой является размещение вашего кода где-нибудь в папке config/initializers, этифайлы автоматически загружаются при запуске, и вы можете определить общие классы / модули / константы там

0 голосов
/ 06 мая 2019

Вы можете поместить его в ApplicationRecord (application_record.rb)

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  VALID_PHONE_NUMBER_REGEX = /\d{10}/ # your regex here
end

И затем вы можете использовать его в любой модели, которая наследуется от ApplicationRecord

0 голосов
/ 06 мая 2019

Один из способов сделать это - создать запрос, который будет включен в каждую модель с номером телефона.В 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Вы также можете использовать здесь любую другую логику, связанную с телефонными номерами, например, разбор и тому подобное.Преимущество этого подхода состоит в том, что вся ваша логика, связанная с телефонными номерами, будет доступна для использования в моделях, которые в ней нуждаются, и ни одна из этой логики не будет доступна в моделях, которые в ней не нуждаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...