У меня проблемы с инициализацией моей модели.
Я пытаюсь построить модель, которая принимает строку 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
Где код, в котором вы фактически инициализируете модель и сохраняете ее? Выложите здесь, пожалуйста. И вам, вероятно, следует удалить комментарии в вашем коде здесь, на самом деле это не поможет нам решить вашу проблему.
Привет - Спасибо за ответ. Я самоучка в отношении Ruby и Rails, поэтому я всегда учусь. Некоторые из очевидных глобальных переменных ($docraptor) были в некоторой документации, но я приму это к сведению. Некоторые вещи, казалось, сломались, когда я оставил требования на более высоком уровне класса, но я еще раз проверю. Должно ли что-то из этого быть в контроллере? Я строил это в соответствии с рекомендациями модели «тонкий контроллер». Хотя я не уверен, что это лучше. Комментарии были удалены соответственно. Спасибо за помощь!
Приложение Heroku: ропот-камера-54696.herokuapp.com
Я бы посоветовал открыть консоль rails и попытаться сохранить запись с теми же атрибутами, что и у контроллера. Если есть ошибка, посмотрите на трассировку стека, чтобы определить, из какой строки она возникла. Боюсь, без этой информации на этот вопрос невозможно ответить. Я предполагаю, что, поскольку вы можете вызвать @url_data_model.save, вы уже инициализировали запись без ошибок. Ни один другой код модели не запускается с кодом, который вы показали.
Привет Макс - Спасибо за помощь. Теперь имеет смысл упомянуть, что другой код не запускается. Я сейчас возвращаюсь к этому проекту. Я проверю консоль и посмотрю, смогу ли я сохранить запись. Спасибо!





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