He definido un modelo story
con un archivo adjunto image
manejado por Paperclip, que se parece a:Paperclip (3.0) y barandas (3.2): f.file_field pierde ruta del archivo en el 'nuevo' acción después de un error de validación
class Story < ActiveRecord::Base
has_attached_file :image # [...]
attr_accessible :user_id, :title, :image, :image_file_name
belongs_to: user
validates_presence_of :user_id
validates :title, :length => { :maximum => 50 }
validates_attachment_size :image, :less_than => 2.megabytes, :unless => Proc.new { |story| story[:image].nil? }
# [...]
end
Cuando lleno mi forma de historia, que se parece a:
<%= form_for @story, html: { multipart: true } do |f| %>
<% if @story.errors.any? %>
<div id="error-explanation">
<ul>
<% @story.errors.full_messages.each do |msg| %>
<li class="error-mess">Error: <%= msg.downcase %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.text_field :title %></td>
<%= f.file_field :image %>
<%= f.submit t('.send') %>
<% end %>
Si falla la validación para un story.title demasiado tiempo, el formulario se devuelve correctamente junto con el mensaje de error adecuado y la titl no válido e ya cumplimentado, pero el file_field
está ahora en blanco y tengo que volver a hacer clic para volver a seleccionar el archivo que deseo cargar.
Y aquí es cómo mi stories_controller.rb parece:
def create
@story = @current_user.stories.new(params[:story])
if @story.save
redirect_to thanks_path
else
# [email protected] so I render action 'new' again just to
# bang my head against this 'anomaly'
render action: "new"
end
end
¿Cómo puedo evitar que los usuarios tengan que volver a seleccionar el archivo a subir después de un error de validación?
que estoy enfrentando el mismo problema, le parecieron una solución ?? ¡Gracias! – yorch
Solo uno gráfico: cuando se selecciona una imagen, doy una respuesta de UI a través de jQuery. Dado que mi campo de imagen es generado por '<% = f.file_field: image%>' puedo usar el siguiente jQuery para activarlo: '$ (" # story_image "). Change (function() {$ (" # image_selected ") .show (300);});' Entonces, en mi opinión, tengo un div oculto "image_selected" que contiene un gif elocuente ... Si encuentras una solución _real_, ¡házmelo saber! – Darme