Papaerclip no funciona con el método de actualización

He Persona modelo:

class Person
  include Mongoid::Document
  include Mongoid::MultiParameterAttributes
  include Mongoid::Paperclip

  attr_accessible :photo,:name
  has_mongoid_attached_file :photo, :styles => {:thumb => "100x100>" }, default_url: "/images/:style/missing.png"

  field :photo
  field :name  
end  

Y en mi acción de actualización of ManagedbController Hago:

def edit
    @person=Person.find_by(name: params[:name])
end

def update
    @person=Person.find_by(name: params[:name])
    @person.update_attributes(photo: params[:photo])
end  

editar.html.erb

<h2> Add photo here!</h2>
<%= @person.name %>

<%= form_for @person, url: {controller: :managedb,action: :update}, html: {mulitpart: true}  do |f| %>
  <p><%= f.hidden_field :name %></p>
  <p><%= f.file_field :photo %></p>
  <p><%= f.submit :submit , class: "btn btn-large btn-success" %></p>
<% end %>  

cuando visito la página de edición obtengo el nombre de la persona de @persona.nombre lo que significa que la variable @person es NO NULO

Pero cuando selecciono una imagen y haga clic en enviar me sale este error en el método de actualización:

Mongoid::Errores::Documento no encontrado

Documento no encontrado para la clase Persona con atributos {:name=>nil}.

At

 @person=Person.find_by(name: params[:name])  

Parámetros de solicitud

{"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"jpm+Ljk6rvZP9bIUw2gA9BvfZXsnATzsIpEEJMTbuzY=", "person"=>{"name"=>"child", "photo"=>#<ActionDispatch::Http::UploadedFile:0x007ffa20a05330 @original_filename="deepika-padukone-61a.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"person[photo]\"; filename=\"deepika-padukone-61a.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/var/folders/b2/v1ytdy497fj9md28f7pr9wgm0000gn/T/RackMultipart20130911-3884-daf5yu>>}, "commit"=>"submit", "controller"=>"managedb", "action"=>"update"}

Rack session

¿Que esta mal aquí? ¡Ayuda! Estoy usando Mongoid y Rails 3.2.13.

preguntado el 11 de septiembre de 13 a las 14:09

1 Respuestas

No da el nombre de la persona en el formulario, así que params[:name] is nil. Puede agregar un campo oculto para mantener el nombre (id es mejor) y consígalo en su controlador con params.

Pruebe lo siguiente:

<h2> Add photo here!</h2>
<%= @person.name %>

<%= form_for @person, url: {controller: :managedb,action: :update}, html: {mulitpart: true}  do |f| %>
  <p><%= f.hidden_field :name %></p>
  <p><%= f.file_field :photo %></p>
  <p><%= f.submit :submit , class: "btn btn-large btn-success" %></p>
<% end %> 

EDITAR

Le sugiero que separe su acción en ManageDbController : 1 para mostrar el formulario (debe ser edit) y otro 1 para actualizar tu modelo (update la acción no cambia).

También puedes instalar estas 2 gemas. better_errors y binding_of_caller, pueden ayudarlo a depurar su problema.

Respondido el 12 de Septiembre de 13 a las 15:09

ahora esta dando PersonsController constante no inicializado. Revisa mi pregunta, la he actualizado. La acción de actualización está en otro controlador y no hay ningún controlador como Controlador de personas - usuario2675010

mira el Térmica atributo en el html generado y verifique la url. Parece from_for no le importa url parámetro - JoJoS

No estoy entendiendo lo que está pasando. Ahora estoy de nuevo recibiendo el Mongoid::Errores::Documento no encontrado!! Sin embargo, el multiparte está funcionando. Actualizada la pregunta. - usuario2675010

hizo el @person se actualiza de todos modos? la imagen esta cargada en su sistema de archivos?? - JoJoS

He actualizado mi respuesta;). Si no resuelve su problema, muestre sus rutas por favor. - JoJoS

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.