ruby-on-rails-4 - requisitos - que es ruby on rails y para que sirve
Roo con rails4 que da un método indefinido `[] ''para nil: NilClass (1)
Tuve el mismo problema, parece que hay un problema sobre la codificación del archivo, utilicé este código y fue corregido.
def open_spreadsheet
case File.extname(file.original_filename)
when ".csv" then Roo::CSV.new(file.path, csv_options: {encoding: "iso-8859-1:utf-8"})
when ".xls" then Roo::Excel.new(file.path, nil, :ignore)
when ".xlsx" then Roo::Excelx.new(file.path, nil, :ignore)
else raise "Unknown file type: #{file.original_filename}"
end
end
Espero que eso te ayude
Estoy tratando de importar archivos CSV y Excel en un proyecto de Rails 4 (con validación) usando la gema Roo, basada en http://railscasts.com/episodes/396-importing-csv-and-excel .
Realicé algunos cambios para dar cuenta de Rails4 en lugar de Rails3 y de los cambios en Roo, y mi modelo de ProjectImporter ahora se ve así:
class ProductImport
include ActiveModel::Model
attr_accessor :file
def initialize(attributes = {})
attributes.each { |name, value| send("#{name}=", value) }
end
def persisted?
false
end
def save
if imported_products.map(&:valid?).all?
imported_products.each(&:save!)
true
else
imported_products.each_with_index do |product, index|
product.errors.full_messages.each do |message|
errors.add :base, "Row #{index + 2}: #{message}"
end
end
false
end
end
def imported_products
@imported_products ||= load_imported_products
end
def load_imported_products
spreadsheet = open_spreadsheet
spreadsheet.default_sheet = spreadsheet.sheets.first
puts "!!! Spreadsheet: #{spreadsheet}"
header = spreadsheet.row(1)
(2..spreadsheet.last_row).map do |i|
row = Hash[[header, spreadsheet.row(i)].transpose]
product = Product.find_by(id: row[''id'']) || Product.new
product.attributes = row.to_hash.slice(*[''name'', ''released_on'', ''price''])
product
end
end
def open_spreadsheet
case File.extname(file.original_filename)
when ".csv" then
Roo::CSV.new(file.path, nil)
when ''.tsv'' then
Roo::CSV.new(file.path, csv_options: { col_sep: "/t" })
when ''.xls'' then
Roo::Excel.new(file.path, nil, :ignore)
when ''.xlsx'' then
Roo::Excelx.new(file.path, nil, :ignore)
when ''.ods'' then
Roo::OpenOffice.new(file.path, nil, :ignore)
else
raise "Unknown file type #{file.original_filename}"
end
end
end
Cuando trato de ejecutar una importación (usando datos CSV de prueba), falla en header = spreadsheet.row(1)
con el undefined method ''[]'' for nil:NilClass
error undefined method ''[]'' for nil:NilClass
. La declaración extra puts
que he incluido confirma que la spreadsheet
sí misma no es nil: !!! Spreadsheet: #<Roo::CSV:0x44c2c98>
da !!! Spreadsheet: #<Roo::CSV:0x44c2c98>
!!! Spreadsheet: #<Roo::CSV:0x44c2c98>
. Pero si trato de llamar a casi todos los métodos esperados, como #last_row
, me da el mismo error de método no definido.
Entonces, ¿qué estoy haciendo mal?