2012-02-16 28 views
20

Soy nuevo en Rails, y estoy tratando de usar el link_to helper para crear un enlace que emita una solicitud PUT en lugar de una solicitud GET. Específicamente, intento crear un enlace que active la cuenta de un usuario en mi aplicación desde el panel del administrador. Estoy usando Rails 3.0.5.Ruby on Rails link_to Con put Método

Mi archivo tiene routes.rb:

match '/admin/users/:id/activate' => 'admin#activate_user', 
    :action => :activate_user, :via => :put 

Mi opinión tiene:

link_to 'Activate', :action => :activate_user, :id => user.id, :method => :put 

Sin embargo, esto genera la URL (por ejemplo) /admin/users/7/activate?method=put con el código fuente <a href="/admin/users/7/activate?method=put">Activate</a>.

me gustaría para generar, en cambio, <a href = "/admin/users/7/activate" data-method="put">Activate</a>

me di cuenta que podía usar button_to, pero he estado luchando con este problema por un tiempo y estoy confundido por qué estoy viendo este comportamiento, cuando otros tutoriales dicen que lo que estoy haciendo debe ser válido. ¿Cómo puedo crear un link_to helper con el comportamiento que quiero?

Respuesta

25

Actualizado - El helper link_to hará un GET a menos que se especifique un método.

Es mejor especificar el tipo de solicitud exacta, en lugar de match en el archivo de rutas. ¿Cómo sobre la sustitución de match por put en rutas como:

put '/admin/users/:id/activate' => 'admins#activate_user', :as => 'activate_user' 

link_to 'Activate', activate_user_path(user.id), method: :put 

El método activate_user debe residir en admins controlador. El docs tiene más información sobre link_to helper.

+1

¿Qué hace las rutas de rake para arriba? ¿Puedes publicarlo? – prasvin

+1

Esto funciona, ¡gracias! Y es la solución más limpia :) – maksim

+4

Esto no funciona para mí. Si no se define ningún método en el link_to, recibo un mensaje de error No ruta coincide [GET]. – ndemoreau

30

link_to piensa que :method => :put es parte de la ruta hash. Tienes que decirlo de otra manera. Envuelve tu camino entre paréntesis.

link_to 'Activate', {:action => :activate_user, :id => user.id}, :method => :put 

Ahora link_to reconocerán :method => :put como una opción, no es parte de la ruta del enlace.

Como nota al margen, debe intentar usar ayudantes de ruta en lugar de hash de ruta siempre que sea posible. Mantiene las cosas limpias y ordenadas, y evita situaciones puntillosas como esta.