Manejo de respuestas de Ajax en rieles -- ruby campo con ruby-on-rails camp codereview Relacionados El problema

Handling ajax responses in Rails


2
vote

problema

Español

Tengo el siguiente método que crea un mensaje para una publicación:

  def create   post.likes.create(user: current_user)   respond_to do |format|     format.html { redirect_to post_redirect(post) }     format.js   end end   

Realmente no nos importa si la creación fue exitosa o no redirigir al usuario a la publicación (la página donde se llama el método) o devolver algunos JS si se realiza a través de AJAX (generalmente).

El aspecto parcial JS:

  // create.js.erb $("#content").html("<%= j render(:partial => 'likes/like_button') %>");   

Sin embargo, no me gustó que espera que la solicitud AJAX solicite JS y luego tenga un rendimiento parcial dentro de un método jQuery que luego haga una suposición sobre #content existente para hacerlo dentro. Tan efectivamente, la respuesta también está manejando cómo se debe usar.

Mi enfoque alternativo fue:

  def create   post.likes.create(user: current_user)   request.xhr? ? (render :partial => 'likes/like_button') : (redirect_to post_redirect(post)) end   

De esta manera, solo devolvemos el parcial o redireccionado dependiendo de si la solicitud fue a través de AJAX.

El primero parece ser el enfoque estándar de los rieles (según la mayoría de los documentos), pero encuentro a este último más limpio, ya que significa que puedo manejar cómo se maneja la respuesta, ya que simplemente devuelve HTML en lugar de tener el manejo real de la respuesta. Ser devuelto con la respuesta.

¿Hay una mejor manera de manejar las respuestas de AJAX? ¿O las razones por las que mi enfoque se consideraría mala práctica? Por supuesto, utilizando el primer enfoque significa usar rieles UJS y mis propios usos de JS personalizado para hacer la solicitud y manejar la respuesta.

Original en ingles

I have the following method which creates a like for a post:

def create   post.likes.create(user: current_user)   respond_to do |format|     format.html { redirect_to post_redirect(post) }     format.js   end end 

We don't really care whether the create was successful or not and either redirect the user to the post (the page where the method is called) or return some js if done via AJAX (usually).

The js partial looks like:

// create.js.erb $("#content").html("<%= j render(:partial => 'likes/like_button') %>"); 

However I didn't like that it expects the AJAX request to request JS and then having a partial render inside a jQuery method that then makes an assumption about #content existing to render it inside. So effectively the response is also handling how it should be used.

My alternative approach was:

def create   post.likes.create(user: current_user)   request.xhr? ? (render :partial => 'likes/like_button') : (redirect_to post_redirect(post)) end 

This way we just return the partial or redirect depending on if the request was via AJAX.

The former seems to be the standard Rails approach (according to most docs) but I find the latter far cleaner as it means I can handle how the response is handled as it just returns HTML rather than having the actual handling of the response being returned with the response.

Is there a better way to handle AJAX responses? Or reasons why my approach would be considered bad practice? Of course using the first approach means using Rails UJS and my own uses custom JS to make the request and handle the response.

     

Lista de respuestas

1
 
vote

Sin embargo, no me gustó que espera que la solicitud AJAX solicite JS y luego tenga un rendimiento parcial dentro de un método de jQuery que luego haga un supuesto sobre #content existente para hacerlo dentro. Tan efectivamente, la respuesta también está manejando cómo se debe usar.

En realidad, creo que esta es la mejor práctica para una solución no spa. Es un gran enfoque porque sabrás cómo se estructura la página. Funciona incluso si hay múltiples publicaciones porque puede asignar ID de objetos a las publicaciones en el HTML, lo que le permite apuntar a esos objetos en su selector de jQuery.

así que estarías mirando algo como:

  $('.post[data-object-id=<%= post.id %> .likes').html('<%= j render(partial: 'likes/like_button', locals: {likes: post.likes}) %> ')   

Ahora, si desea hacer algo fantástico con el HTML más allá de solo insertarlo en la ubicación apropiada, entonces, de hecho, haría una solicitud AJAX para el HTML, y adjuntará un controlador a la promesa generada a partir de la solicitud AJAX que lo haría manejar la respuesta HTML adecuadamente.

 

However I didn't like that it expects the AJAX request to request JS and then having a partial render inside a jQuery method that then makes an assumption about #content existing to render it inside. So effectively the response is also handling how it should be used.

I actually think this is best practice for a non-SPA solution. It's a great approach because you will know how the page is structured. It works even if there's multiple posts because you can assign object IDs to the posts in the HTML, which then lets you target those objects in your JQuery selector.

So you'd be looking at something like:

$('.post[data-object-id=<%= post.id %> .likes').html('<%= j render(partial: 'likes/like_button', locals: {likes: post.likes}) %> ') 

Now if you want to do something fancy with the HTML beyond just inserting it at the appropriate location, then you'd indeed make an AJAX request for the HTML, and attach a handler to the promise generated from the AJAX request which would handle the HTML response appropriately.

 
 

Relacionados problema

3  Prueba de un controlador API de rieles  ( Testing a rails api controller ) 
Estoy construyendo una API de JSON. Estoy escribiendo mis pruebas de controlador para que comparen el organismo de respuesta al JSON real, estoy generando en ...

1  Sistema de eventos de Rails JS  ( Rails js event system ) 
Estoy trabajando en una gema que es relativamente simple. funciona agregando data-controller data-action55544335 Atribuye a la etiqueta del cuerpo y lu...

4  Convertidor de temperatura que parece violar SRP  ( Temperature converter that seems to violate srp ) 
He escrito esta clase para dos propósitos (creo que solo este hecho muestra que este código viola srp < / a>): convertir el peso de una unidad a otra y para ...

2  PEQUEÑO: configuración regional  ( Small setting locale ) 
Soy nuevo en rieles / Ruby y me gustaría obtener comentarios sobre mi pequeño 99887766655443312 que puede detectar el idioma del visitante. Estoy especialme...

1  Importando archivos de marcas  ( Importing markdown files ) 
Estoy construyendo una aplicación de rieles que, entre otras cosas, importan los archivos de marca de texto como publicaciones de blogs. La idea es que la ver...

3  Semilla una base de datos  ( Seed a database ) 
Estoy buscando consejos / mejores prácticas para evitar hacer un conjunto profundo anidado de IF / 99887766555443333 en Rails. La intención es sembrar una...

1  Cómo reducir el número de "Si las declaraciones" jerárquicas "[CERRADO]  ( How to reduce number of hierarchical if statements ) 
cerrado . Esta pregunta necesita detalles o claridad . Actualmente no está aceptando respuestas. ...

2  Estructura de ruta para múltiples asociaciones en rieles  ( Route structure for multiple associations in rails ) 
Estoy haciendo un sitio en este momento (primer sitio de Rails, aprendiendo como código) y me preocupa que estoy complicando las rutas. Mis asociaciones se ...

1  Rake Tarea para enviar a los usuarios un recordatorio para publicar con condiciones  ( Rake task to send users a reminder to post with conditions ) 
Estoy implementando una característica que recuerda a los usuarios que realicen una publicación por correo electrónico si El usuario ha establecido recorda...

2  Prueba de unidad RSPEC para actualizar una propiedad de un modelo  ( Rspec unit test for updating a property of a model ) 
Sé cómo escribir pruebas de RSPEC simples y pruebas de unidad. Solo quiero saber si esto es lo suficientemente bueno o si hay mejoras que pueda hacer. Tengo...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos