ruby on rails - notidentifiedbyimagemagickerror - Error de Paperclip: falta el modelo requerido attr_accessor para ''avatar_file_name''
rails gem upload file (3)
Asegúrese de que en paperclip_database: migration utilice el plural para el nuevo nombre de tabla y en el generador de clips que use singular:
rails g paperclip_database:migration cms_article_category cms_article_category_images
rails g paperclip cms_article_category cms_article_category_image
Y compruebe los nombres de las columnas resultantes en su base de datos En su ejemplo, la columna en la tabla de avatar debe llamarse avatar_file_name
Entonces quiero usar Paperclip para tener fotos para cada Listado. Agregué el código apropiado a los listados show.html.erb, el modelo listing.rb, los listados_controller.rb y _form.html.erb partial.
Cuando intento subir una imagen para el listado obtengo este error:
Paperclip::Error in ListingsController#update
Listing model missing required attr_accessor for ''avatar_file_name''
Línea 44 de listados_controlador:
def update
respond_to do |format|
if @listing.update(listing_params)
format.html { redirect_to @listing, notice: ''Listing was successfully updated.'' }
format.json { head :no_content }
else
Algunas cosas para probar: es decir, agregar un código al modelo listing.rb para hacer que las imágenes aceptables para: avatar sean más robustas. Esto es lo que mencionaron varias publicaciones de stackoverflow agregando al modelo listing.rb:
validates_attachment_content_type :avatar, :content_type => %w(image/jpeg image/jpg image/png)
Lamentablemente, sigo teniendo el mismo error cuando adjunto una imagen. Cuando no adjunto una imagen, mi imagen predeterminada se carga correctamente y la lista se crea correctamente.
Mi modelo de listado:
class Listing < ActiveRecord::Base
has_attached_file :avatar, :styles => { :medium => "150x", :thumb => "100x100>" }, :default_url => "default.jpg"
validates_attachment_content_type :avatar, :content_type => %w(image/jpeg image/jpg image/png)
end
Mi _form.html.erb parcial:
<%= form_for @listing, :html => { :multipart => true } do |f| %>
<% if @listing.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@listing.errors.count, "error") %> prohibited this listing from being saved:</h2>
<ul>
<% @listing.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="form-group">
<%= f.label :name %><br>
<%= f.text_field :name, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :company %><br>
<%= f.text_field :company, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :email %><br>
<%= f.text_field :email, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :phone %><br>
<%= f.text_field :phone, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :avatar %><br>
<%= f.file_field :avatar, class: "form-control" %>
</div>
<div class="form-group">
<%= f.submit class: "btn btn-primary" %>
</div>
<% end %>
Mi controlador de listings_controller.rb:
def update
respond_to do |format|
if @listing.update(listing_params)
format.html { redirect_to @listing, notice: ''Listing was successfully updated.'' }
format.json { head :no_content }
else
format.html { render action: ''edit'' }
format.json { render json: @listing.errors, status: :unprocessable_entity }
end
end
end
...
def listing_params
params.require(:listing).permit(:name, :company, :email, :phone, :avatar)
end
Y mi archivo schema.rb
ActiveRecord::Schema.define(version: 20140329174335) do
create_table "listings", force: true do |t|
t.string "name"
t.string "company"
t.string "email"
t.string "phone"
t.datetime "created_at"
t.datetime "updated_at"
end
end
EDITAR: Al agregar la salida de la consola después de ejecutar $ rails se genera el clip de lista de papel avatar
(Necesito 10 puntos de reputación para publicar, así que debe conformarse con el enlace http://i.imgur.com/c8KGTa3.png )
Desde el mensaje de error, file_name no está disponible en el modelo al que intenta guardar. Tuve un problema similar y me di cuenta de que olvidé ejecutar la migración de Paperclip:
rails generate paperclip [Model Name] [Attachment]
(p. ej., rails g paperclip Images image
)
Si eso no funciona, dado que el problema es la columna "nombre_de_archivo", intente agregar eso al modelo (por ejemplo, rails g migration addFilenameToImages file_name:string
)
Esto funcionó para mí, ¡así que espero que ayude a algunos de ustedes también!
Supongo que olvidó crear los campos correspondientes para avatar
en la tabla de listings
.
Le sugiero que genere una migración para agregar avatar
a la tabla de listings
siguiente manera:
rails generate paperclip listing avatar
Luego ejecute rake db:migrate
ACTUALIZAR
Según tus comentarios y EDIT, tienes un archivo de migración para agregar avatar
a la tabla de listings
que creaste al ejecutar rails generate paperclip user avatar
pero desafortunadamente por alguna razón no está pasando, es decir, no hay avatar specific fields("avatar_file_name", "avatar_content_type", "avatar_file_size" and "avatar_updated_at")
en la tabla de listings
según su db/schema.rb
. Este es un comportamiento muy extraño.
Le sugiero que siga los siguientes pasos mencionados en orden:
Destruye la migración existente, si hay alguna:
rails destroy paperclip listing avatar
Genera una nueva migración:
rails generate paperclip listing avatar
correr
rake db:migrate
ACTUALIZACIÓN 2
Espero que no me hayas votado (pero alguien lo hizo), por lo que me gustaría avisar que se trata de un problema continuo con Paperclip y sugerí una solución en mis comentarios (31 de marzo) como se muestra a continuación:
Quiero que pruebes como gema ''paperclip'',: git => "git: //github.com/thoughtbot/paperclip.git" en Gemfile y luego paquete de instalación. Avísame cuando termines
Aparentemente no fue notado por usted o por alguien que me votó hoy. Además, dijiste No errors as far as I can tell, image here:
i.imgur.com/c8KGTa3.png PERO si miras la salida, hay un error que dice claramente:
migration_file_name '': protected methodmigration_file_name'' llamado para PaperclipGenerator: 0x007fb3c6494c20 (NoMethodError)