2011-01-29 15 views
6

quería crear un enlace básico "destruir" en Rails hoy, así que escribió esto:¿Por qué son necesarios los archivos javascript predeterminados para crear un enlace de destrucción en los rieles?

<%= link_to "destroy me", @company, :method=>:delete 
%> 

El código generado fue:

<a href="/companies/1" 
data-method="delete" 
rel="nofollow">destroy me</a> 

En mis rutas, la habitual

resources :companies 

Y mi acción de destrucción estaba en mi controlador.

Pero cada vez que hago clic en el enlace, me redirigen a la acción show. Extraño.

Resultó que no incluya la siguiente línea en mi diseño:

<%= javascript_include_tag :defaults %> 

Después de su inclusión, el enlace destruir trabajado!

¿Por qué? ¿Por qué debería incluir las etiquetas de JavaScript predeterminadas para que esto funcione?

Y como no quiero usar prototipos, ¿cómo solo incluyo los archivos que necesito?

Respuesta

6

Desde 3.0, los railes forman helpers generando etiquetas HTML limpias con atributos de datos HTML5 (método de datos en su ejemplo). Para admitir estos atributos de datos, se requiere rails.js para el prototipo. Si usa jQuery, entonces se necesita la versión de jQuery (https://github.com/rails/jquery-ujs).

En pocas palabras, rails.js junto con el marco javascript (prototipo o jquery) hace algo de magia para enganchar clic y otros eventos en una etiqueta, de otro modo al hacer clic en un enlace, ocurre un clic normal porque sin javascript, el enlace es un enlace normal.

+0

Respuesta principal allí. – changelog

2

Es debido a las limitaciones de html y al hecho de que las etiquetas de anclaje no pueden enviar solicitudes con ningún otro método que no sea GET.

Si mira rails.js (que se incluirá con :defaults), al hacer clic en un enlace que tiene "método de datos", genera y envía un formulario que utiliza el método http correcto para enviarlo a la url especificado en la etiqueta de anclaje

Es una solución alternativa, pero no existe realmente otra opción para hacer que las etiquetas de anclaje normales envíen solicitudes DELETE (o cualquier otro verbo HTTP que GET).

Si no desea usar js, utilice un formulario (tal vez usando button_to en vez de link_to) para realizar la solicitud. Si creas tu propio ayudante para compilar el formulario, puedes hacer que use la etiqueta del botón (a diferencia de una entrada que construye rieles), que es bastante fácil de hacer para que parezca un enlace normal.

+0

¿Por qué votar abajo? ¿Mi respuesta no es correcta? – idlefingers

+0

El voto a la baja no fue mío, pero la respuesta de James fue en el acto. – changelog

Cuestiones relacionadas