2010-09-23 15 views
38

Estoy usando Rails 3 y tengo una página que muestra una lista de publicaciones de la base de datos. Me gustaría poder eliminar una publicación de un enlace.Eliminar enlace envía "Obtener" en lugar de "Eliminar" en la vista de Rails 3

El segundo ejemplo a continuación funciona, pero el primero no. ¿Alguien sabe por qué el primero no funcionará? Mi vista contiene:

# this link sends a "GET" request which asks for the #show function 
<%= link_to 'Delete', post, :method => :delete %> 

# this link sends the proper "DELETE" request which asks for the #destroy function 
<%= button_to 'Delete', post, :method => :delete %> 

mi archivo de rutas contiene lo siguiente:

resources :posts 

Respuesta

48

Asegúrese de que la sección de <head> en el diseño incluye lo siguiente:

<%= javascript_include_tag :defaults %> 
<%= csrf_meta_tag %> 

En Rails 3, la las solicitudes de eliminación se están manejando con la ayuda de JavaScript para garantizar que la solicitud se envía correctamente. Si no tiene las metaetiquetas csrf y el código JavaScript requerido, elimine los enlaces que no funcionarán. Los archivos JavaScript :defaults incluyen, entre otros, prototype.js y application.js. Este último contiene las cosas que hacen que el enlace funcione, pero se basa en el marco Prototype.

Si no desea utilizar las bibliotecas predeterminadas de Prototype JavaScript, existen puertos de application.js para muchos otros frameworks. Puede encontrar el jQuery one here, por ejemplo.

Los botones seguirán funcionando independientemente de JavaScript, ya que el código HTML generado con button_to incluye toda la información necesaria por sí mismo. Es por eso que está viendo que el botón funciona mientras que el enlace no funciona.

+0

Gran respuesta. Gracias. –

+0

Esto me ayudó mucho. – Rupert

+0

gracias. ¿Podría publicar un enlace para obtener más información sobre esta característica de rails 3? – gorn

3

En mi caso, estaba usando following.

<%= javascript_include_tag :defaults %> 
<%= csrf_meta_tag %> 

También estaba usando jQuery al incluir jQuery justo debajo del prototipo predeterminado JS. Eso estaba causando algún tipo de conflicto.

17

parece

<%= javascript_include_tag :defaults %> 

ya no es compatible

http://apidock.com/rails/ActionView/Helpers/AssetTagHelper/JavascriptTagHelpers/javascript_include_tag

su lugar, debe utilizar

<%= javascript_include_tag 'application' %> 
+0

Esto es cierto para Rails 4.0.3. Intenté aplicar la respuesta aceptada, y no funcionó hasta que hice la sustitución que señalaste aquí. –

+0

salvó mi tocino! – brntsllvn

+0

¡Esta debería ser la respuesta aceptada! ¡Gracias! –

0

Esto funcionará. El problema es el hecho de que necesita pasarlo por el camino correcto para que la ruta lo obtenga.

<%= link_to 'Delete', post_path(post.id), :method => :delete %> 
-1

Prueba esto .. es un simple cambio ..

añadir esto a su ruta.rb archivo

get '/ listas /: list_id/comentarios /: id' => 'Comentarios # destruyen'

hice este cambio y ahora su trabajo ..

+2

Nunca es una buena idea que las solicitudes GET hagan cambios duraderos – Vincent

Cuestiones relacionadas