Инициализация модели - Передача параметров - Rails 5

У меня проблемы с инициализацией моей модели.

Я пытаюсь построить модель, которая принимает строку url_address при инициализации, использует DocRaptor для создания PDF-файла, затем использует pdf-reader для чтения данных из этого PDF-файла и, наконец, удаляет сохраненный PDF-файл.

Когда у меня есть пустая модель, я могу сохранить ее, используя формы Rails 5, согласно вводному руководству по Rails 5, здесь: https://guides.rubyonrails.org/getting_started.html

Я создал новый проект с нуля, используя базу данных postgresql, и приступил к работе с Руководством. Я смог нормально сохранить модели с пустым определением UrlDataModel. Однако, когда я отредактировал свою модель, чтобы она содержала функции, необходимые для извлечения PDF-файла и его чтения, я получаю

NoMethodError - undefined method '[]' for nil:Class

Я знаю, что эта ошибка означает, что моя модель пуста, поэтому я пытаюсь устранить неполадки, как это происходит.

Контроллер выходит из строя

@url_data_model.save

Мой репозиторий здесь: https://github.com/blueMesaEngineering/Минотавр-копыто

Модель следует здесь:


class UrlDataModel < ApplicationRecord
  attr_accessor :url_address, :pdf_version, :producer, :title, :metadata, :page_count

  def initialize(attributes = {})
    @url_address = attributes[:url_address]
    @pdf_version = attributes[:pdf_version]
    @producer = attributes[:producer]
    @title = attributes[:title]
    @metadata = attributes[:metadata]
    @page_count = attributes[:page_count]
  end

  def after_initialize
    buildModelFromURLViaPDF
  end

  def buildModelFromURLViaPDF
    convertURLToPDF
    readPDFData
    deletePDF
  end

  def convertURLToPDF
    require 'bundler/setup'
    Bundler.require

    DocRaptor.configure do |dr|
      dr.username = 'YOUR_API_KEY_HERE' # this key works for test documents
      # dr.debugging = true
    end

    $docraptor = DocRaptor::DocApi.new

    begin
      logPathName = './storage/Logs/standardOutput/output.txt'
      errorLogPathName = './storage/Logs/Error/'
      pathName = './storage/PDFs/'
      # url         = "http://docraptor.com/examples/invoice.html"
      url = 'http://www.docraptor.com'
      @url_address = url

      fileNamePDF  = 'docraptor-ruby.pdf'

      create_response = $docraptor.create_async_doc(
        test: true, # test documents are free but watermarked
        document_url: url, # or use a url
        name: fileNamePDF, # help you find a document later
        document_type: 'pdf' # pdf or xls or xlsx
      )

      loop do
        status_response = $docraptor.get_async_doc_status(create_response.status_id)

        # puts "doc status: #{status_response.status}"

        case status_response.status

        when 'completed'
          doc_response = $docraptor.get_async_doc(status_response.download_id)
          File.open('./storage/PDFs/docraptor-ruby.pdf', 'wb') do |file|
            file.write(doc_response)
          end
          # puts "Wrote PDF to " + pathName + fileNamePDF

          break

        when 'failed'

          # puts "FAILED"
          # puts status_response
          break

        else

          sleep 1

      end
      end
    rescue DocRaptor::ApiError => error
      # puts "#{error.class}: #{error.message}"
      # puts error.code          # HTTP response code
      # puts error.response_body # HTTP response body
      # puts error.backtrace[0..3].join("\n")
    end
  end

  def readPDFData
    require 'rubygems'
    require 'pdf/reader'

    fileName = './storage/PDFs/docraptor-ruby.pdf'

    PDF::Reader.open(fileName) do |reader|
      @pdf_version = reader.pdf_version
      # @producer   = reader.producer
      # @title     = reader.title
      @metadata = reader.metadata
      @page_count = reader.page_count
    end
  end

  def deletePDF
    require 'fileutils'

    FileUtils.rm_rf('./storage/PDFs/docraptor-ruby.pdf')
  end
end

Пенни за ваши мысли? Я здесь до конца вечера, так что я смогу ответить напрямую. Спасибо, что заглянули!

Ваше здоровье.

Контроллер: https://pastebin.com/QVaHCMep

Трассировка стека: https://pastebin.com/uQbXgiaH

Пара (или четыре) штуки. Во-первых, вам, вероятно, следует указать всю трассировку стека в своем вопросе (часто легче понять ошибку и откуда она может исходить). Во-вторых, ИМО, вы значительно перегружаете ответственность этой модели. В-третьих, кажется странным, что эти операторы require разбросаны повсюду (и операторы configure тоже). В-четвертых, и, наконец, это выглядит как глобальная переменная ($docraptor), которая может и не иметь большого значения, но лично я ею никогда не пользуюсь.

jvillian 08.03.2019 01:29

Где код, в котором вы фактически инициализируете модель и сохраняете ее? Выложите здесь, пожалуйста. И вам, вероятно, следует удалить комментарии в вашем коде здесь, на самом деле это не поможет нам решить вашу проблему.

Antarr Byrd 08.03.2019 01:51

Привет - Спасибо за ответ. Я самоучка в отношении Ruby и Rails, поэтому я всегда учусь. Некоторые из очевидных глобальных переменных ($docraptor) были в некоторой документации, но я приму это к сведению. Некоторые вещи, казалось, сломались, когда я оставил требования на более высоком уровне класса, но я еще раз проверю. Должно ли что-то из этого быть в контроллере? Я строил это в соответствии с рекомендациями модели «тонкий контроллер». Хотя я не уверен, что это лучше. Комментарии были удалены соответственно. Спасибо за помощь!

ND Guthrie 08.03.2019 02:57

Приложение Heroku: ропот-камера-54696.herokuapp.com

ND Guthrie 08.03.2019 03:00

Я бы посоветовал открыть консоль rails и попытаться сохранить запись с теми же атрибутами, что и у контроллера. Если есть ошибка, посмотрите на трассировку стека, чтобы определить, из какой строки она возникла. Боюсь, без этой информации на этот вопрос невозможно ответить. Я предполагаю, что, поскольку вы можете вызвать @url_data_model.save, вы уже инициализировали запись без ошибок. Ни один другой код модели не запускается с кодом, который вы показали.

max pleaner 08.03.2019 10:53

Привет Макс - Спасибо за помощь. Теперь имеет смысл упомянуть, что другой код не запускается. Я сейчас возвращаюсь к этому проекту. Я проверю консоль и посмотрю, смогу ли я сохранить запись. Спасибо!

ND Guthrie 09.03.2019 03:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
90
0

Другие вопросы по теме