Ошибка Ruby on Rails при разборе XML - PullRequest
0 голосов
/ 27 апреля 2018

Теперь я получаю эту ошибку при разборе XML с использованием моего сервера Ruby on Rails:

ERROR -- : exception while processing events: undefined method 

`content' for nil:NilClass Backtrace
-- /var/www/distribution/distribution-server/app/models/upload_action.rb:23:in `block in upload'
-- /var/www/distribution/distribution-server/app/models/upload_action.rb:14:in `each'
-- /var/www/distribution/distribution-server/app/models/upload_action.rb:14:in `upload'
-- /var/www/distribution/distribution-server/app/services/run_listener.rb:8:in `block in start'

Соответствующий код:

def self.upload(xml_files)
actions = []

xml_files.each do |xml_file|
  if File.exist?(xml_file)
    doc = File.open(xml_file) { |f| Nokogiri::XML(f) }

    action = UploadAction.new
    action.file_name = [doc.xpath("//field[@index='103']").first.content]
    action.content_provider_name = doc.xpath("//field[@index='45']").first.content
    action.content_provider_title = doc.xpath("//field[@index='24']").first.content
    action.created_date = doc.xpath("//field[@index='13']").first.content.to_date
    action.credit_line = doc.xpath("//field[@index='91']").first.content

Ошибка возникает в третьей строке 'action', action.content_provider_name. Все обязательные поля в XML заполнены правильно. Если я изменю doc.xpath("//field[@index='45']").first.content на строку, например «Пример строки», то в action.content_provider_title будет ошибка.

Редактировать

Частичный пример полей XML:

`<metadata>
<field index="24" type="picklist" 
name="content_provider_title">title</field>
<field index="45" type="picklist" 
name="content_provider_name">name</field>
<field index="79" type="text" name="Monitor State">Restored</field>
<field index="81" type="checkbox" name="Confirm Delete">false</field>
</metadata>`

1 Ответ

0 голосов
/ 27 апреля 2018

В зависимости от используемой вами версии Rails, вы можете изменить следующую строку на одну из опций ниже:

action.file_name = [doc.xpath("//field[@index='103']").first.content]

Обновление до:

action.file_name = [doc.xpath("//field[@index='103']").first&.content]
# or
action.file_name = [doc.xpath("//field[@index='103']").first.try(:content)]

Обе эти опции защищают от ошибок NilClass. Если вам не обязательно нужно значение для action.file_name, это исправит ошибку.

В противном случае это случай, когда селектор (doc.xpath("//field[@index='103']")) определенно правильный (кажется, что вы не получаете сообщение об ошибке, вызывающее first), и, если это так, что определенно есть данные в массив, который он возвращает.

Надеюсь, это поможет - дайте мне знать, если у вас есть какие-либо вопросы.

...