2011-09-06 10 views
6

que tienen un número de carriles estándar validaciones dentro de mi modelo:Carriles no generar mensajes de validación fallan

validates_presence_of :url_string 
validates_uniqueness_of :url_string 
validates_presence_of :stream_source 
validates_presence_of :width 
validates_presence_of :height 
validates_presence_of :name 
validates_uniqueness_of :name 
validates_presence_of :customer_name 
validates_presence_of :iframe_background_color 

Si no llene uno de estos campos dentro de mi formulario y luego me llevan de nuevo a la forma como se esperaba, pero lo extraño es que no se muestran mensajes de error. Estoy utilizando el código de abajo para mostrar los mensajes de error:

<% @camera.errors.full_messages.each do |error| %> 
    <p><%= error %></p> 
<% end % 

También he tratado de imprimir objeto los camera.errors @ y esto es lo que se muestra:

#<ActiveModel::Errors:0x12db19bc @base=#<Camera id: 1, stream_source: "test", width: 640, height: 360, active: true, name: "test", url_string: "CAYD19Vp", customer_name: "test", iframe_background_color: "#FFFFFF", online: true, created_at: "2011-08-30 15:54:16", updated_at: "2011-09-06 15:52:48", audio: true, iframe_text_color: "#FF00FF", iframe_link_color: "#FF0000", notes: "Some notes!", offline_image_file_name: "Cake.jpg", offline_image_content_type: "image/jpeg", offline_image_file_size: 196591, offline_image_updated_at: "2011-09-06 12:12:38", pull_stream_url: "test", bitrate: "300-500", show_branding: false>, @messages={}> 

Como se puede ver la mensajes hash está vacío. Intenté configurar manualmente el mensaje de error de validación haciendo lo siguiente:

validates_presence_of :name, :message => "No name present" 

pero no llenó el mensaje hash tampoco.

Controlador de acción de actualización se muestra a continuación:

def update 
    @camera = Camera.find(params[:id]) 
    if @camera.update_attributes(params[:camera]) 
    flash[:notice] = "Camera updated" 
    redirect_to nwcadmin_camera_path 
    else 
    redirect_to :action => :edit 
    end 
end 

estoy usando la versión de Ruby Ruby and Rails 1.9.2p290 versión 3.1.0.

¡Cualquier asistencia sería genial!

Gracias

+1

El código del controlador probablemente sea útil aquí. – jdl

+0

Gracias, he agregado la acción de actualización del controlador. – stephenheron

+0

Logré llegar al fondo de mi problema pero como no puedo responder mi propia pregunta por otras 7 horas, pondré la solución aquí por el momento. En el controlador que estaba usando: redirect_to: action =>: editar que debería haber estado usando: render: action =>: editar Mediante el uso de redirect_to me estaba golpeando la acción de edición dentro del controlador que era entonces obtener un nuevo objeto de cámara de la base de datos en lugar de preservar el objeto de cámara de la acción de actualización. – stephenheron

Respuesta

5

Logré llegar al fondo de mi problema. En el controlador que estaba usando:

redirect_to :action => :edit 

que debería haber estado usando:

render :action => :edit 

Mediante el uso de redirect_to me estaba golpeando la acción de edición dentro del controlador que entonces fue conseguir un nuevo objeto cámara desde la base de datos en lugar de preservar el objeto de cámara actual de la acción de actualización.

2

a menos que llame @camera.save o @camera.valid?, el hash errores no se rellenará con los errores de validación. Por favor revisa tu código de controlador.

+0

update_attributes ejecuta validaciones a medida que ejecuta el método save una vez que ha actualizado sus atributos. Puede ver esto si ve el origen de update_attribute. http://apidock.com/rails/ActiveRecord/Base/update_attributes – stephenheron

2

Puede usar el flash [: mensaje] o el flash [: aviso] en el código del controlador para almacenar el mensaje de error, que se puede utilizar a la vista para mostrar los errores. Link Eche un vistazo al enlace, se explica claramente, cómo adjuntar los mensajes de error y usarlos para mostrarlos. La variable de instancia no contiene ningún error ya que no se ejecuta ninguna validación en la actualización.

Puede utilizar @camera_errors = @ camera.save para recoger los errores y luego

<% @camera_errors.errors.full_messages.each do |error| %> 
    <p><%= error %></p> 
    <% end %> 
6

Sólo una cabeza que obtendrá un error de Validation failed (ActiveRecord::RecordInvalid) con un mensaje de error vacía (si no hay otros errores) cuando se tiene before_validation declaraciones y cualquiera de ellos devuelva false.

Tenga en cuenta que before_validation devoluciones de llamada no deben volver false (nil está bien) y esto puede suceder por accidente, por ejemplo, si está asignando false a un atributo booleano en la última línea dentro de ese método de devolución de llamada. Escriba explícitamente return true en sus métodos de devolución de llamada para hacer que esto funcione (o simplemente true al final si su devolución de llamada es un bloque (como se indica en here)).

ACTUALIZACIÓN: Esto ya no será un problema a partir Rails 5.0, como return false ya no habrá detener la cadena de devolución de llamada (throw :abort ahora detener la cadena de devolución de llamada).

ACTUALIZACIÓN: También podría recibir una devolución de llamada ActiveRecord::RecordNotSaved: Failed to save the record si vuelve false.

+0

wow. Nunca lo hubiera adivinado. ¡Gracias por salvarme probablemente horas de inspección! –

+1

@LawrenceWu, sí, pasé horas para encontrar el problema yo mismo. :-) –

Cuestiones relacionadas