Проблемы с проверкой при создании записи с помощью импорта файла с использованием Roo gem и после railscast

#csv #ruby-on-rails-4 #rails-activerecord #railscasts #roo-gem

#csv #ruby-on-rails-4 #rails-activerecord #railscasts #roo-gem

Вопрос:

Я пытаюсь создавать записи с помощью формата импорта файлов, который может быть csv excel и т. Д., И я реализовал его после Railscast396. но когда я импортирую файл, в нем говорится: «Ошибка проверки: адрес электронной почты не может быть пустым, пароль не может быть пустым. Вот мой код

     class Student < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  has_many :quizzes
  has_many :classrooms

  #to import file
  **def self.attr_names
    [:email, :password, :password_confirmation]
  end**

  def self.import(file)
    spreadsheet = open_spreadsheet(file)
    header = spreadsheet.row(1)
    (2..spreadsheet.last_row).each do |i|
      row = Hash[[header, spreadsheet.row(i)].transpose]
      row.inspect
      student = find_by_id(row["id"]) || new
      student.attributes = row.to_hash.slice(*attr_names)
      student.save!
    end
  end

  def self.open_spreadsheet(file)
  case File.extname(file.original_filename)
    when ".csv" then Roo::CSV.new(file.path, file_warning: :ignore)
    when ".xls" then Roo::Excel.new(file.path, file_warning: :ignore)
    when ".xlsx" then Roo::Excelx.new(file.path, file_warning: :ignore)
    else raise "Unknown file type: #{file.original_filename}"
  end
end

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end
  

просмотр

 <%= form_tag addStudents_classrooms_path, multipart: true do %>
  <%= file_field_tag :file %>
  <%= submit_tag "Import" %>
<% end %>
  

ресурсы routes.rb
: классы выполняют
сбор { сообщение: addStudents }

csv-файл, который я пытаюсь загрузить

 id,email,password,password_confirmation
22,jim@gmail.com,password,password
23,jimhanks@gmail.com,password,password
  

Комментарии:

1. каков результат row.to_hash.slice(*attr_names)

2. его {}, не могли бы вы сказать мне, почему это происходит

Ответ №1:

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

Попробуйте это:

 def self.attr_names
  %w(email password password_confirmation)
end