Rails CSV Import - слишком длинное имя файла @ rb_sysopen - PullRequest
1 голос
/ 08 октября 2019

Таким образом, мой метод импорта имеет следующее в 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

1 Ответ

0 голосов
/ 08 октября 2019

Похоже, что вы передаете содержимое файла методу CSV.foreach, он ожидает путь к файлу, а не фактическое содержимое. Правильная форма будет list_occo = CSV.foreach(the_path_of_the_file, headers: true) do |row|.

Полагаю, вы можете использовать что-то похожее на то, что у вас уже есть:

csv_text = File.read(file_path)
csv = CSV.parse(csv_text).to_s

Полагаю, если вы удалите вызов to_s, CSV.parse(csv_text) дает вам массив строк, просто выполните csv.each do |row| после этого.

EDOT: правильное использование CSV.parse:

csv_text = File.read(file_path)
CSV.parse(csv_text) do |row|
  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...