Ruby on Rails link_to con el método put
rails link_to class (2)
Soy nuevo en Rails, y estoy tratando de usar el enlace para crear un enlace que emita una solicitud PUT en lugar de una solicitud GET. Específicamente, estoy tratando de crear un enlace que active la cuenta de un usuario en mi aplicación desde el panel de administración. Estoy usando Rails 3.0.5.
El archivo de mis rutas.rb tiene:
match ''/admin/users/:id/activate'' => ''admin#activate_user'',
:action => :activate_user, :via => :put
Mi vista 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
<a href="/admin/users/7/activate?method=put">Activate</a>
/admin/users/7/activate?method=put
con el código fuente <a href="/admin/users/7/activate?method=put">Activate</a>
.
Me gustaría generar, en cambio, <a href = "/admin/users/7/activate" data-method="put">Activate</a>
Me doy cuenta de que podría usar button_to, pero he estado luchando con este problema por un tiempo y estoy confundido sobre por qué veo este comportamiento, cuando otros tutoriales dicen que lo que estoy haciendo debería ser válido. ¿Cómo puedo crear un link_to helper con el comportamiento que quiero?
link_to
piensa que :method => :put
es parte del hash de ruta. 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á :method => :put
como una opción, no parte de la ruta del enlace.
Como nota al margen, debe intentar usar ayudantes de ruta en lugar de hashes de ruta siempre que sea posible. Mantiene las cosas bonitas y ordenadas, y evita situaciones delicadas como esta.
Actualizado : el ayudante link_to
realizará un GET a menos que se especifique un método.
Es mejor especificar el tipo exacto de solicitud, en lugar de match
en su archivo de rutas. ¿Qué hay de reemplazar 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 de activate_user
debe residir en el controlador de admins
. La docs tiene más información en link_to
helper.