36

Rails 3 fa alcune cose interessanti per fare Javascript discreto, così hanno fatto le cose in questo modo:Come "Data-method = 'delete' di Rails 3" Degradare con garbo?

= link_to "Logout", user_session_path, :method => :delete 

..converts a

<a href="/logout" data-method="delete" rel="nofollow">Logout</a> 

Ma appena si è verificato a me .. Quando ho spegni javascript il metodo non è più DELETE, è GET come previsto. Quindi, ci sono piani per, o c'è un modo per, consentire a questi attributi data- di degradarsi con garbo, in modo che il collegamento sia ancora una richiesta DELETE?

risposta

37

La modifica apportata in Rails 3 con questi attributi data- non riguardava il degrado aggraziato, ma riguardava JavaScript non invadente.

In Rails 2, la specifica di :method => :delete su un collegamento generava un intero gruppo di JavaScript inline che creava un modulo con un input nascosto e quindi inviava il modulo. Era lo stesso di adesso: disattiva JavaScript e imposta automaticamente una richiesta GET. In quanto tale, supportare il caso di nessun JavaScript è lo stesso di prima.

Un'opzione consiste nell'utilizzare un modulo/pulsante invece di un collegamento in modo da poter includere il metodo come campo nascosto, proprio come fa JavaScript Rails 2. Un'altra opzione è che la versione GET porti a una pagina intermedia che a sua volta ha il modulo/pulsante.

Il vantaggio del nuovo approccio è che non è invadente. Il JavaScript per la modifica del verbo HTTP esiste in un file esterno e utilizza gli attributi data- per determinare a quali elementi deve essere collegato.

4

L'unica possibilità che si ha è definire un modulo. Un link non può essere un POST con _method = "delete" senza Javascript o per modulo.

+0

può avere query string _method = cancella – myfreeweb

+0

può funziona, sì, proprio – shingara

21

Invece di utilizzare il metodo link_to - che richiederebbe di utilizzare JavaScript per garantire che il metodo HTTP è DELETE - utilizzare il metodo button_to, che creerà un modulo con un elemento di input nascosto che racconta Rails per trattare l'HTTP metodo come DELETE anziché POST. Se necessario, puoi utilizzare CSS per applicare uno stile al pulsante nel modulo in modo che assomigli ad un collegamento.

+0

Questo ha funzionato per me, quando il link stesso è stato caricato dopo il fatto tramite JavaScript, impedendo Rails da sostituirlo con il modulo. Presumo che 'button_to' abbia funzionato perché lo trasforma in un modulo sul lato Ruby delle cose invece che con JavaScript dopo che la pagina è stata caricata. Non avevo mai sentito parlare di 'button_to' prima, quindi grazie! – LouieGeetoo

1

Non è possibile senza javascript.

Realizzo un piccolo plug-in jQuery per convertire l'attributo data-method in moduli pseudo nascosti (ad esempio, nel progetto laravel).

Se si desidera utilizzarlo:? https://github.com/Ifnot/RestfulizerJs