Разбор xml, загруженного с помощью camt_parser rails gem - PullRequest
0 голосов
/ 11 июня 2018

Я установил драгоценный камень camt_parser в своем приложении rails.Моя цель - загрузить и проанализировать camt_file (.xml).

Он отлично работает, когда я разбираю локальный файл следующим образом:

require 'camt_parser'
require 'camt'
camt = CamtParser::File.parse 'CAMT053_140518.xml'
puts camt.group_header.creation_date_time
camt.statements.each do |statement|
    statement.entries.each do |entry|
        # Access individual entries/bank transfers
     #   puts "->"
     puts entry.description
     puts entry.debit
     p entry.transactions[0].iban
     p entry.transactions[0].transaction_id
     puts entry.transactions[0].debitor.iban
    end
end

Но когда я пытаюсь загрузить его из моегопросмотреть в виде файла, используя этот код:

<%= form_tag '/patient_page/import_camt', :multipart => true do %>
    <label for="file">Upload text File</label> <%= file_field_tag "file" %>
    <%= submit_tag %>
<% end %>

и

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

def import_camt
    uploaded_file = params[:file]
    parsed_file = uploaded_file.read
    camt = CamtParser::File.parse uploaded_file
    puts camt.group_header.creation_date_time
    camt.statements.each do |statement|
        statement.entries.each do |entry|

        puts entry.description
        puts entry.debit
        p entry.transactions[0].iban
        p entry.transactions[0].transaction_id
        puts entry.transactions[0].debitor.iban
        end
    end
  end

Я получаю следующую ошибку

"нетнеявное преобразование ActionDispatch :: Http :: UploadedFile в String "в строке, когда я пытаюсь проанализировать загруженный файл.

Любые подсказки?

Thx!

1 Ответ

0 голосов
/ 11 июня 2018

CamtParser::File.parse ожидает путь к файлу, но вы передаете объект ActionDispatch::Http::UploadedFile.

Когда вы загружаете файл в рельсы, файл помещается в экземпляр ActionDispatch::Http::UploadedFile.Для доступа к самому файлу существует атрибут tempfile.

. Он вернет Tempfile, представляющий фактический загружаемый файл.Tempfile имеет метод path, который представляет собой путь к самому файлу, поэтому, поскольку CamtParser::File.parse ожидает путь к файлу, его можно вызвать следующим образом

CamtParser::File.parse(uploaded_file.tempfile.path) 

CamtParser также имеет String класс, который может анализировать соответствующую строку, чтобы вы могли назвать ее как

CamtParser::String.parse(uploaded_file.read)

Это работает, потому что ActionDispatch::Http::UploadedFile предоставляет метод read, который аналогичен вызову uploaded_file.tempfile.read

...