2011-03-15 11 views
15

Estoy creando una aplicación de demostración simple que permite al usuario ingresar su dirección de correo electrónico para registrar su interés en recibir acceso beta. La aplicación luego les envía un correo electrónico de confirmación que les informa que hemos recibido su solicitud. Si alguna vez se inscribió para recibir una notificación de un lanzamiento beta, entonces se entiende la idea.Error al manejar con Ajax en Rails 3

Tengo curiosidad acerca de cómo manejar los errores en Rails 3 mientras uso AJAX. Antes de implementar mi bloque respond_to, tenía un formulario que hacía que los errores compartidos fueran parciales.

Aquí está el formulario.

<% if flash[:notice] %> 
<p><%= flash[:notice] %></p> 
<% end %> 

<p>Sign up to be notified when the beta launches.</p> 

<%= form_for @user, :remote => true do |form| %> 

    <%= render '/shared/errors', :target => @user %> 

    <%= form.label :email, "Your Email Address" %> 
    <%= form.text_field :email %> 

    <%= form.submit "Notify Me" %> 
<% end %> 

Y aquí están los errores mencionados anteriormente.

<% if target.errors.any? %> 

<ul> 
    <% target.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
    <% end %> 
</ul> 

<% end %> 

Cosas muy estándar. La acción del controlador se ve así.

def create 
@user = User.new(params[:user]) 

respond_to do |format| 
    if @user.save 
    format.html { redirect_to :back, flash[:notice] = "Thanks for your interest! We'll let you know when the app is in beta." } 
    format.js 
    else 
    format.html { render :action => :new } 
    format.js 
    end 
end 
end 

Todo funciona perfectamente antes de implementar ajax. Si el formulario pasa la validación, verá el mensaje flash de éxito y, en caso negativo, verá una lista de errores. Entonces, ahora que tengo un archivo create.js.erb, ¿cómo debo manejar los errores sin repetirme o es imposible? Obviamente quiero mantener esto lo más seco posible.

+0

¿Te ayudó esta respuesta? – Techism

Respuesta

16

Aún puede representar un parcial compartido para todos los errores .js en su archivo js.erb.

<% if @user.errors.any? %> 
    var el = $('#create_user_form'); 
    // Create a list of errors 
    <%= render :partial=>'js_errors', :locals=>{:target=> @user} %> 
<% else %> 
    $('#users_list').append("<%= escape_javascript(render :partial=>"users/show", :locals=>{:user => @user }) %>"); 
    // Clear form 
    el.find('input:text,textarea').val(''); 
    el.find('.validation-errors').empty(); 
<% end %> 

Y su parcial podría ser similar (jQuery Suponiendo):

<% target.errors.full_messages.each do |error| %> 
    var errors = $('<ul />'); 
    errors.append('<li><%= escape_javascript(error) %></li>'); 
    <% end %> 

Pero también hay otra opción ... Es incluso secadora.

http://www.alfajango.com/blog/rails-3-remote-links-and-forms/

Si está trabajando su camino a través de ajax en los carriles 3, esta guía es realmente el mejor para la comprensión de las respuestas y Ajax prestación en su estado actual.

Trabajé a través de esta guía y publiqué en los comentarios cómo puedes usar tus parciales de HTML para las respuestas de solicitud HTML y AJAX. Lo hice por accidente y luego seguí sobre cómo hacerlo.

¡Disfrútalo!

En realidad puede devolver html directamente con su respuesta al igual que antes.

Aquí está la versión corta:

def create 
    @something = Somethng.new(params[:something]) 
    if @something.save 
     respond_with(@something, :status => :created, :location => @something) do |format| 
     format.html do 
      if request.xhr? 
      render :partial => "something/show", :locals => { :billable => @billable }, :layout => false 
      end 
     end 
     end 
     else 
     respond_with(@something.errors, :status => :unprocessable_entity) do |format| 
      format.html do 
      if request.xhr? 
       render :partial => "something/new", :locals => { :something => @something }, :layout => false 
      else 
       render :action => :new 
      end 
      end 
     end 
     end 
    end 
2

No estoy seguro de los rieles de forma remota manera de hacerlo, pero mi modo de operación estándar es devolver los objetos a petición ajax en este formato:

{ success: true|false, 
    data: "html or some other data", 
    errors: {} } // jsonified ActiveModel::Errors object 

Funciona muy bien y le permite representar parciales en el campo de datos para usar en la página, o puede recorrer errores en el objeto de error para insertar mensajes de error o resaltar campos.

2

He estado enfrentando el mismo problema hace unos días. Usé la opción remote => true en mi formulario para usar Ajax en mi aplicación Rails 3. Después de eso, he estado buscando una solución para validar mis campos de formulario.Después de probar una buena cantidad de enfoques jQuery/Javascript (ninguno de ellos me funcionó), llegué a conocer una gema excelente llamada client_side_validations. Es muy fácil de instalar siguiendo las instrucciones en el enlace github (https://github.com/bcardarella/client_side_validations). Funciona como un encanto para la validación de los campos de formulario del lado del cliente, una joya impresionante. Espero que esto ayude a las personas que están cansadas de buscar una solución simple para la validación del lado del cliente de los campos del modelo después de usar Ajax en la aplicación Rails 3.

Cuestiones relacionadas