PDA

Visualizza la versione completa : Rails: problemi di post e di get


corvallo
24-02-2010, 23:14
Salve a tutti premetto che sono un nuovo utente di rails quindi molte cose ancora non mi sono ben chiare.
Sto cercando di implementare una finestra di login per un applicazione

allora la vista data al mio controller è la seguente



<h1>Login#accesso</h1>

<form action="/login/login" method=get>

Username:<%= text_field_tag("username")%>



Password:<%=text_field_tag("password")%>



<%=submit_tag "Accedi" %>
</form>


il form fa riferimento al metodo login del controller login (al cui interno sono presenti login ,logout,accesso)
Ora se lascio il codice di sopra con il metodo get il tutto funziona, cioè riesco ad "aprire" il metodo login del controller login.
Diversamente se uso il metodo post di invio dei dati mi compare questa schermata:

ActionController::InvalidAuthenticityToken in LoginController#login

ActionController::InvalidAuthenticityToken

RAILS_ROOT: /home/corvallo/Unisalento/applicazione
Application Trace | Framework Trace | Full Trace

/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/request_forgery_protection.rb:79:in `verify_authenticity_token'
/usr/lib/ruby/gems/1.9.1/gems/activesupport-2.3.5/lib/active_support/callbacks.rb:178:in `evaluate_method'
/usr/lib/ruby/gems/1.9.1/gems/activesupport-2.3.5/lib/active_support/callbacks.rb:166:in `call'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/filters.rb:225:in `call'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/filters.rb:629:in `run_before_filters'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/filters.rb:615:in `call_filters'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/filters.rb:610:in `perform_action_with_filters'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/benchmarking.rb:68:in `block in perform_action_with_benchmark'
/usr/lib/ruby/gems/1.9.1/gems/activesupport-2.3.5/lib/active_support/core_ext/benchmark.rb:17:in `block in ms'
/usr/lib/ruby/1.9.1/benchmark.rb:309:in `realtime'
/usr/lib/ruby/gems/1.9.1/gems/activesupport-2.3.5/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/benchmarking.rb:68:in `perform_action_with_benchmark'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/rescue.rb:160:in `perform_action_with_rescue'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/flash.rb:146:in `perform_action_with_flash'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/base.rb:532:in `process'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/filters.rb:606:in `process_with_filters'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/base.rb:391:in `process'
/usr/lib/ruby/gems/1.9.1/gems/actionpack-2.3.5/lib/action_controller/base.rb:386:in `call'

Nella guida che stavo leggendo per imparare ad usare rails, viene usato il method post
Proprio non riesco a capire del perchè di quest'errore. Sto sbagliando qualcosa?
Ringrazio anticipatamente tutti

weppos
27-02-2010, 12:00
Il tuo problema è che non inserisci l'autenticity token che serve per validare le chiamate post.
E' un controllo di sicurezza attivo di default su Ruby.

Di norma non si usa mai scrivere un form a mano ma si adottano gli appositi helper proprio perché quest'ultimi inglobano una serie di automatismi funzionali all'applicazione.
Se scrivi form a mano, allora devi includere l'autenticity token.

Stessa cosa vale per le URL. Non si scrivono mai a mano, si usano le regole di routing. Non sapendo come hai chiamato la regola di routing per il login, scrivo la versione estesa con url_for



<h1>Login#accesso</h1>

<% form_tag url_for(:controller => "login", :action => "login"), :method => :post do %>
Username:<%= text_field_tag("username")%>



Password:<%=text_field_tag("password")%>



<%=submit_tag "Accedi" %>
<% end %>

mlipreri
01-03-2010, 15:40
aggiungendo al tuo controller

skip_before_filter :verify_authenticity_token

disabiliti la protezione...ma te lo sconsiglio.

Loading