невозможно проанализировать несколько телефонных номеров с помощью методов gsub и || = ruby - PullRequest
0 голосов
/ 18 сентября 2018

В настоящее время я работаю над анализом телефонных номеров в форме PDF.Я использую самоцвет pdf-form, который также использует pdftk.Номера телефонов возвращаются в формате JSON при запросе службы форм, которую я использую FormStack .

. Я создал DICTIONARY, чтобы сопоставить идентификатор поля в PDF-форме сидентификатор поля в ответе JSON FormStack.Таким образом, я мог бы перебирать их.

DICTIONARY = {
    'Applicant Name'              => '66563757', #Name
    'DATE OF BIRTH mmddyyyy'      => '66563844', #Date of Birth
    ##
    'TELEPHONE NUMBER area code 1'=> '66563943', #Primary Phone - Area code (000)
    'TELEPHONE NUMBER first 3 1'  => '66563943', #Primary Phone - (000) 000
    'TELEPHONE NUMBER Last 4 1'   => '66563943', #Primary Phone - (000) 000-0000
    'CELLPHONE NUMBER area code 1'=> '66563947', #Secondary Phone - Area code (000)
    'CELLPHONE NUMBER first 3 1'  => '66563947', #Secondary Phone - (000) 000
    'CELLPHONE NUMBER Last 4 1'   => '66563947', #Secondary Phone - (000) 000-0000

    'TELEPHONE NUMBER area code 2'=> '66564485', #Phone - Area code (000)
    'TELEPHONE NUMBER first 3 2'  => '66564485', #Phone - first 3 - (000) 000
    'TELEPHONE NUMBER Last 4 2'   => '66564485', #Phone - last 4 - (000) 000-0000

     }

Как видите, телефонные номера разбиты на первые 3-значный код города, вторые 3 цифры и последние 4. Я создал библиотеку для разбора этогономера телефонов в поле формы PDF.Значения в хэше DICTIONARY являются полями в цифровой форме в FormStack.enter image description here USER_DATA - это то, что передается в initialize(user_submission_data), который является данными пользователя, когда он заполняет форму.

class PdfScrie < FillablePdfForm

  def initialize(user_submission_data)
    @user_submission_data = user_submission_data
    super()
  end

  private

  DICTIONARY = {

  }

  APPLICANT_ADDRESS_FORM_FIELD_ID = "66563934"
  TENANT_REPRESENTATIVE_ADDRESS_FORM_FIELD_ID = "66564487"

  TELEPHONE_NUMBER_1_id = "66563943"
  CELLPHONE_NUMBER_1_id = "66563947"

  ADDRESS_FIELD_IDS = [
    APPLICANT_ADDRESS_FORM_FIELD_ID,
    TENANT_REPRESENTATIVE_ADDRESS_FORM_FIELD_ID,
  ].freeze

  PHONE_NUMBER_FIELD_IDS = [
    TELEPHONE_NUMBER_1_id,
    CELLPHONE_NUMBER_1_id
  ].freeze

  def fill_out
    form_fields.each do |field|
      id = DICTIONARY[field]
      @user_submission_data
        .select {|fd| fd[:field] == id}
        .each do |field_data|
          if address_field?(field_data[:field])
            break_address_into_state_city_zipcode(field_data[:value], field)
          elsif phone_number?(field_data[:field])
            parse_phone_number(field_data[:value])
            fill(field, @phone_number_sections.shift)
          else
            fill(field, field_data[:value])
          end
        end
    end
  end

  def address_field?(field)
    ADDRESS_FIELD_IDS.include?(field.to_s)
  end

  def break_address_into_state_city_zipcode(address, field)
    address_by_section = FormStack::Form.parse_formstack_nested_attrs(address)
    address_by_section.each do |section,value|
       fill(field, value) if form_field_has_section?(field, section)
    end
  end

  def form_field_has_section?(form_field_name, address_section)
    form_field_name.include? address_section.upcase
  end

  def parse_phone_number(phone_number)
    @phone_number_sections ||= phone_number.gsub(/\D+/, "").match(/(...)(...)(....)/).captures
  end

  def phone_number?(field)
    PHONE_NUMBER_FIELD_IDS.include?(field.to_s)
  end
end

Однако, при переборе только по PHONE_NUMBER_FIELD_IDSпервый номер телефона анализируется.Когда я запускаю метод binding.pry fill_out, я вижу, что на самом деле это число, которое я хочу проанализировать.

[2] pry(#<PdfScrie>)> parse_phone_number(field_data[:value])
=> ["201", "785", "9896"]
[3] pry(#<PdfScrie>)> fill(field, @phone_number_sections.shift)
=> "201"

Однако CELLPHONE_NUMBER_1_id не анализируется, и я могуне понимаю, почему это не так. enter image description here

Это метод fill, который используется другой библиотекой и преобразует ее в PDF.

 def fill(key, value)
    attributes[ key.to_s ] = value
  end

  def pdftk
    @pdftk ||= PdfForms.new()
  end

1 Ответ

0 голосов
/ 19 сентября 2018

Если я правильно читаю ваш код, проблема в том, что пустой массив не ложный.

> foo = []
# => []
> foo ||= [1]
# => []

Итак, после того, как вы обработали первый номер телефона, второй никогда не помещается в@phone_number_sections для обработки.

Что вам, вероятно, нужно сделать, это добавить новые снимки в разделы следующим образом:

def parse_phone_number(phone_number)
  @phone_number_sections ||= []
  @phone_number_sections += phone_number.gsub(/\D+/, "").match(/(...)(...)(....)/).captures
end

В качестве альтернативы, поскольку это выглядит так, как будто это возможночисло, которое будет добавлено несколько раз, возможно, вам придется сделать это:

def parse_phone_number(phone_number)
  if @phone_number_sections.nil? or @phone_number_sections.empty?
    @phone_number_sections = phone_number.gsub(/\D+/, "").match(/(...)(...)(....)/).captures
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...