Reputation: 53
I have the following file seed. I am trying to save the information in the DB, but this produces the following error. I do not know if I am calling the image load wrong or I am specifying something that does not exist, but I know that the file I try to upload with this is at the given path in the file.
historia1 = History.new({
title: "Capitán, el perro que vive junto a la tumba de su dueño",
description: "Desde que Miguel murió, su perro Capitán se siente muy solo.
Una de las formas que tiene de expresarlo y estar más cerca del que fue su amo
y cuidador es acercándose cada día a la tumba, en la ciudad argentina de Córdoba,
y tumbándose encima. Según explicó la esposa de Miguel, el perro fue un regalo para
su hijo. Días después de la muerte de Miguel, Capitán desapareció de casa; estuvo
durante un tiempo durmiendo en la calle, hasta que le perdieron el rastro.
Un día, madre e hijo fueron a visitar la tumba de Miguel y se encontraron allí a Capitán.
El perro se nos acercó ladrando, como si llorara, confiesan.
Aunque lo llamaron el can permaneció inmóvil, en la tumba.
Una semana más tarde volvieron al cementerio y se toparon de nuevo con Capitán.
Esta vez regresó con ellos a casa, pero sigue visitando la tumba de Miguel a diario.",
history_status: 'publicada',
user_id: 1,
images_attributes: {
picture:File.open('public/images/capitan.jpg'),
name:"Capitán, el perro que vive junto a la tumba de su dueño"
}
})
historia1.save
The error:
rails aborted!
NoMethodError: undefined method `[]' for #<File:public/images/capitan.jpg>
/home/adrian/Documentos/Ucab/Desarrollo/Proyecto/Entrega II/cloancionPrueba/pabigo/db/seeds/history_seed.rb:1:in `<main>'
/home/adrian/Documentos/Ucab/Desarrollo/Proyecto/Entrega II/cloancionPrueba/pabigo/lib/tasks/custom_seed.rake:8:in `block (4 levels) in <main>'
/home/adrian/Documentos/Ucab/Desarrollo/Proyecto/Entrega II/cloancionPrueba/pabigo/bin/rails:9:in `<top (required)>'
/home/adrian/Documentos/Ucab/Desarrollo/Proyecto/Entrega II/cloancionPrueba/pabigo/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:seed:history_seed
(See full trace by running task with --trace)
Models
history.rb
class History < ApplicationRecord
belongs_to :user, optional: true
has_many :images, as: :imageable, dependent: :destroy do
def length
reject(&:marked_for_destruction?).length
end
end
accepts_nested_attributes_for :images, allow_destroy: true
validates :title, presence: { message: 'El título no puede estar vacío' }
validates :description, presence: { message: 'La descripción no puede estar vacía' }
validates :title, length: { in: 5..75,
too_long: " 50 caracteres es lo maximo permitido",
too_short: " 5 caracteres es lo minimo permitido" }
validates :description, length: { in: 5..2000,
too_long: " 1500 caracteres es lo máximo permitido",
too_short: " 5 caracteres es lo minimo permitido" }
def self.search(search)
if search
where("title LIKE ?", "%#{search}%")
elsif search2
where("created_at LIKE ?", "%#{search}%")
else
find(:all)
end
end
end
image.rb
class Image < ApplicationRecord
attr_accessor :validate_picture
belongs_to :imageable, polymorphic: true, optional: true
mount_uploader :picture, PictureUploader
validates :picture, presence: true, if: :validate_picture?
def validate_picture?
validate_picture == 'true' || validate_picture == true
end
end
Upvotes: 0
Views: 462
Reputation: 7339
You're super close. And the error is a little unhelpful, because it makes you think there is something wrong with the image file, but it's not.
when you call objects_attributes: (plural) and not object_attributes: (singular) - then you need to wrap your object has in an array, because, potentially, there will/can be more than 1 hash. Your seed should look more like:
history = History.new(
title: "Capitán, el perro que vive junto a la tumba de su dueño",
description: "Desde que Miguel murió, su perro Capitán se siente muy solo.
Una de las formas que tiene de expresarlo y estar más cerca del que fue su amo
y cuidador es acercándose cada día a la tumba, en la ciudad argentina de Córdoba,
y tumbándose encima. Según explicó la esposa de Miguel, el perro fue un regalo para
su hijo. Días después de la muerte de Miguel, Capitán desapareció de casa; estuvo
durante un tiempo durmiendo en la calle, hasta que le perdieron el rastro.
Un día, madre e hijo fueron a visitar la tumba de Miguel y se encontraron allí a Capitán.
El perro se nos acercó ladrando, como si llorara, confiesan.
Aunque lo llamaron el can permaneció inmóvil, en la tumba.
Una semana más tarde volvieron al cementerio y se toparon de nuevo con Capitán.
Esta vez regresó con ellos a casa, pero sigue visitando la tumba de Miguel a diario.",
history_status: 'publicada',
user_id: 1,
images_attributes: [{
picture: File.open('public/images/capitan.jpg'),
name: "Capitán, el perro que vive junto a la tumba de su dueño"
}]
)
history.save
Upvotes: 1