Metodo link_to di Rails: OTTENERE quando dovrebbe DELETE

Sto seguendo il tutorial di Michael Hartl su Rails e, per qualche motivo, il seguente codice:

 :delete, :confirm => "You sure?", :title => "Delete #{user.name}" %> 

Emette una richiesta GET (come ho verificato controllando il log del server delle rotaie). Ho anche verificato che la seguente riga si trova nella vista dell’applicazione:

  

Una cosa che non ho capito bene, ed è probabilmente la fonte del mio problema: dove è definito il metodo “cancella”? Ho verificato nel codice sorgente di Hartl che definisce un metodo “destroy” nel controller, non “delete”. Ma anche se cambio il link_to in: method =>: destroy, emette semplicemente un GET.

Sto usando Rails 3.1. Qualche consiglio?

La maggior parte dei browser in realtà non supporta il verbo DELETE, quindi Rails lo simula modificando il codice HTML generato. Rails punta su un attributo HTML5 chiamato data-method e lo imposta su "delete" . Quindi, quando un utente fa clic sul link, viene effettivamente emesso come una richiesta GET , ma l’attributo data-method consente la magia di alcuni Rails e indica che il codice di routing dovrebbe riconoscerlo come richiesta DELETE.

modificare:

Puoi testarlo da solo nella console. Esegui bundle exec rails c per entrare nella console, e guarda il codice HTML che questo genera:

 helper.link_to "delete", "https://stackoverflow.com/questions/7465919/rails-link-to-method-geting-when-it-should-delete/foobar/delete", :method => 'delete' 

L’HTML dovrebbe assomigliare a questo:

 delete 

Controlla anche che questo sia nel tuo application.js:

 //= require jquery //= require jquery_ujs 

A quanto pare ho avuto il jquery senza jquery_ujs e ho avuto lo stesso problema fino a quando non l’ho aggiunto.

In realtà, dovresti usare il seguente codice

 <%= button_to "delete", @user_current, :method => "delete" %> 

Risolverà il problema o aggiungerà questa riga // = richiede jquery_ujs a application.js e usa:

  <%= link_to 'delete', user, :method => :delete, data: {:confirm => "You sure?" } , :title => "Delete #{user.name}" %> 

Ho affrontato lo stesso problema con il tutorial di Michael. Il data-method="delete" funziona in realtà come previsto – chiama l’azione destroy nel controller. La ragione per cui tenta di ottenere (e alla fine fallire) è la seguente:

Noterai che uno dei before_filter nel controller è impostato su signed_in_user , e in session_helper.rb , noterai che signed_in_user chiama store_location (metodo privato), che aggiorna la session[:return_to] all’URL corrente.

Quindi, nell’azione di distruzione del controller, tenta di redirect_back_or quale risultato GET current_url . Ho modificato l’helper signed_in_user per chiamare solo store_location quando l’utente non ha già effettuato l’accesso.

Poiché i browser non supportano il verbo DELETE , Rails crea una soluzione alternativa per questo problema simulando una richiesta DELETE tramite un GET o POST standard. Il metodo di method: :delete works è con un gestore JavaScript per tutti i collegamenti con data-method="delete" che modifica la richiesta in modo che Rails lo elabori come DELETE . Questo gestore JavaScript è fornito dalla libreria jquery_ujs .

Ci sono diverse cose che potrebbero essere andate storte:

  1. Assicurati di avere jquery e jquery_ujs caricati in te application.js poiché senza entrambi non verrà elaborato il collegamento.
  2. Assicurati che il link in questione abbia davvero il method: :delete opzione specificata.
  3. Assicurati che per qualche motivo non sia stata interrotta la propagazione dell’evento del link in questione, ad esempio per esempio:
 $( 'a' ).click( function( event ) { event.stopPropagation() }) 

Poiché ciò impedirebbe l’ jquery_ujs gestori jquery_ujs e la richiesta non verrà mai modificata e rimarrà solo un GET standard.

Sulle rotaie 5:

Hanno lo stesso problema, tutti i post di “DELETE” sono stati compromessi, hanno influenzato le mie pagine di crude E hanno escogitato signout … per risolvere il problema tutto quello che dovevo fare era:

// = richiede rails-ujs