Таким образом, мой метод импорта имеет следующее в OccupantsController:
def import
@occupant = Occupant::Import.run(params[:file].path, params[:training_event_id]).result
if @occupant.errors.empty?
flash[:notice] = "Imported"
else
flash[:notice] = "You have failed this import"
end
end
Тогда в моих Операциях> Occupant> Import у меня есть следующее:
class Occupant
class Import < Operation
require 'csv'
def call(file, training_event_id)
csv_text = File.read(file)
csv = CSV.parse(csv_text).to_s
binding.pry
list_occo = CSV.foreach(csv, headers: true, header_converters: :symbol) do |row|
occupant = Occupant.new
occupant.training_event_id = row[training_event_id]
occupant.account_number = row['Account Number']
occupant.first_name = row['First Name']
occupant.last_name = row['Last Name']
occupant.email = row['Email']
occupant.hotel = row['Hotel']
occupant.two_beds = row['Two Beds']
occupant.company_id = row['Company ID']
occupant.student_id = row['Student ID']
occupant.address = row['Address']
occupant.address_2 = row['Address 2']
occupant.city = row['City']
occupant.state = row['State']
occupant.zip = row['Zip']
occupant.phone = row['Phone']
occupant.cancellation_agree = row['Cancellation Agree']
occupant.share = row['Share']
occupant.roommate = row['Roommate']
occupant.check_in = row['Check In']
occupant.check_out = row['Check Out']
occupant.to_s
validate_file = check_file(occupant)
occupant.save if validate_file
end
list_occo
binding.pry
end
Это приводит к
Errno :: ENAMETOOLONG (Имя файла слишком длинное @ rb_sysopen - [["Номер учетной записи", "Имя" и т. Д.
У меня изначально был метод импорта и вызовметод соответственно:
Occupant::Import.run(params[:file], params[:training_event_id])
list_occo = CSV.foreach(file.path, headers: true) do |row|
Однако это вызывало ту же проблему. Поэтому я подумал, что могу просто разбить их и сделать csv_text для обработки чтения, а затем выполнить синтаксический анализ чтения файла и затем преобразовать встрока. Не надо.
Я также попытался обновить параметры, чтобы сделать [: file] .read и в методе call, чтобы использовать только файл. Та же проблема.
Теперь, если яdo:
Occupant::Import.run(params[:file].path, params[:training_event_id]).result
list_occo = CSV.foreach(file, headers: true) do |row|
При этой комбинации ошибок не будет, пока я не попытаюсь вызвать другой метод для проверки файлов. Кроме ... ничего не генерируется.
Как читатьчерез файл, избегая слишком длинного имени файла?
EDIT:
Я также пытался в методе импорта:
Occupant::Import.run(params[:file].path, params[:training_event_id]).result
Затем в методе вызова:
url_data = open(file).read()
csv_data = url_data.parse_csv.to_s
CSV.foreach(csv_data, headers: true) do |row|
Это заканчивается:
Errno :: ENOENT (Нет такого файла или каталога @ rb_sysopen