2010-11-16 16 views
6

Tengo un botón_para eso quiero realizar una acción PUT (solo hay una cosa que se puede actualizar sobre este recurso - se actualizará como 'reconocida' , por lo que no hay otros campos de formulario asociados con activar la acción).Rails3 button_to está llamando acción POST, intentando llamar acción PUT

Este es mi punto de vista (el controlador se da explícitamente debido a que el botón se encuentra en una vista que pertenece a otro controlador):

<%= button_to "Acknowledged", :controller => 'practice_sessions', :id => @practice_session.id, :method => :put %> 

En mi archivo de rutas, el recurso ha sido declarado como un recurso reparador :

resources :practice_sessions 

El controlador de este recurso tiene una acción de crear y actualizar, y el botón_al más arriba llama a la acción de crear. Quiero que llame a la acción de actualización.

Esto viene a través del registro justo antes de los fuegos de acción Crea:

Started POST "/practice_sessions?id=21&method=put" for 127.0.0.1 at 2010-11-17 08:52:46 +0000 
    Processing by PracticeSessionsController#create as HTML 
    Parameters: {"authenticity_token"=>"1EW0IlI38d0f4wST5azrCEZVZPfih7i0UvCGSF7eqbc=", "id"=>"21", "method"=>"put"} 

Respuesta

17

Su sintaxis es ligeramente fuera. button_to toma tres argumentos: el título del botón, un hash options y un hash html_options. :method=>:put debe ir en html_options, mientras que los parámetros de ruta deben ir en options. Así se puede reescribir así:

<%= button_to "Acknowledged", { :controller => 'practice_sessions', 
    :id => @practice_session.id}, 
    :method => :put %> 

Cuando hace clic en la solicitud debe ser manejado por PracticeSessionsController#update

+0

Hola, gracias por esto. Ahora recibo 'No coincide con la ruta'/practice_sessions "'. Creo que es porque está PUTting a just/practice_sessions (como lo atestigua la URL http: // localhost: 3000/practice_sessions? Id = 26) en lugar de/practice_sessions/26 en este caso. Seguiré jugando con él, ¡pero apreciaré cualquier consejo! – pakeha

+0

¿Cuál es la salida de 'rake routes'? – zetetic

+0

Se ve como se esperaba. Estas son las líneas que imagino son de interés: practice_session PUT /practice_sessions/:id(.:format) {: action => "actualización",: controller => ""} practice_sessions practice_sessions poste/practice_sessions (. : format) {: action => "create",: controller => "practice_sessions"} – pakeha

1

Puede que tenga que pasar explícitamente el argumento :method => :put en el html_options de hash - se podría conseguir globbed en el options de hash .

Prueba esto:

<%= button_to "Acknowledged", { :controller => 'practice_sessions', :id => @practice_session.id }, :method => :put %> 

(Tenga en cuenta los apoyos explícitos en torno :controller y :id)

+0

Oye, esto no funcionaría para mí (ver mi respuesta a zetetic), pero terminé resolviéndolo usando rutas con nombre (ver mi respuesta). Gracias por su aporte, sin embargo, debería haber notado los argumentos por separado de todos modos. – pakeha

1

Al final me decidí a ir con el enfoque más reparador utilizando rutas con nombre, que parece funcionar bien. Todavía no estoy 100% seguro de por qué el otro método no funcionaría, pero no creo que importe porque parece tanto a) más ordenado yb) más convencional.

<%= button_to "Acknowledge", practice_session_path(@practice_session), :method => :put %> 
Cuestiones relacionadas