【问题标题】:Iterating over array not moving to next object after using next operator使用下一个运算符后迭代数组不移动到下一个对象
【发布时间】:2019-01-18 09:18:03
【问题描述】:

我目前正在尝试将电话号码解析为 PDF 表单。我将电话号码分为三个部分,区号、前 3 个数字和后 4 个数字。

   DICTIONARY = { 
'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
    }

以上是我必须解析电话号码的字段。

  {
    "field": "66563943",
    "value": "(201) 785-9896"
  },

正如您从上面的 sn-p 中看到的,我必须解析该电话号码以将它们放入 PDF 表单字段中。我成功地将数字分解为代码,前 3 和后 4。

  elsif phone_number?(field_data[:field])
      parse_phone_number(field_data[:value])
      @phone_number_sections.each do |section|
         fill(field, section)
         field.next!
      end
    else

field_data如下:

[10] pry(#<PdfScrie>)> field_dataield_data
=> {:field=>"66563943", :value=>"(201) 785-9896"}

但是,该字段在迭代时不会移动。

1] pry(#<PdfScrie>)> field
=> "TELEPHONE NUMBER area code 2"
[2] pry(#<PdfScrie>)> section> section
=> "201"
[3] pry(#<PdfScrie>)> field>)> field
=> "TELEPHONE NUMBER area code 2"
[4] pry(#<PdfScrie>)> section> section
=> "201"
[7] pry(#<PdfScrie>)> @phone_number_sections_sections
=> ["201", "785", "9896"]
[8] pry(#<PdfScrie>)> field>)> field
=> "TELEPHONE NUMBER area code 2"
[9] pry(#<PdfScrie>)> section> section
=> "201"
[10] pry(#<PdfScrie>)> field_dataield_data
=> {:field=>"66563943", :value=>"(201) 785-9896"}

但是,当我转到表单时,电话号码只获取@phone_number_sections 数组中的第一个元素。

 PHONE_NUMBER_FIELD_IDS = [
    TELEPHONE_NUMBER_1_id = "66563943"
  ].freeze

我使用手机 ID 来验证该字段是否需要解析:

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

这是用数据填充表单的方法:

 def fill_form_with_data(field, 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])
      @phone_number_sections.each do |section|
         fill(field, section)
         field.next!
         binding.pry
      end
    else
      fill(field, field_data[:value])
    end

为什么section 没有移动到数组中的下一个元素?

 def fill_out
    form_fields.each do |field|
      id = DICTIONARY[field]
      @user_submission_data
        .select {|fd| fd[:field] == id}
        .each {|field_data| fill_form_with_data(field, field_data) }
    end
  end

如果我删除 field.next!,则只有数组中的最后一个元素会填充到 PDF 表单字段中,因为字段不会移动到 DICTIONARY 中的下一个元素,如下图所示。

【问题讨论】:

  • 我在 PRY 中看不到你在哪里继续 #each 的下一次迭代。你在​​哪里将值分配给 field
  • @ArupRakshit 您可以从 pdf 表单的图像中看出,PDF 表单字段仅填充有 @phone_number_sections 数组中的第一个元素。
  • 是的,我明白了。但是由于某种原因,您的迭代没有完成..要捕获错误,最好查看更多代码或类似内容..我可以看到它是错误的,但无法说出原因...(这里我需要你的帮助来帮助你)
  • @ArupRakshit 我会添加更多代码,也许这会有所帮助。我现在就编辑它
  • @ArupRakshit 我只是编辑帖子

标签: arrays ruby each


【解决方案1】:

将您的fill_out 方法写为:

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

不需要fill_form_with_data 方法。当前代码中的问题是,@phone_number_sections 数组迭代直到每个电话字段的最后一个值。所以字段得到@phone_number_sections数组的最后一个值。但上面的代码将修复它 IMO。

【讨论】:

    猜你喜欢
    • 2021-02-26
    • 2022-08-17
    • 1970-01-01
    • 2011-01-08
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多