Aiuto! Ho un problema con l'esecuzione di JS

Salve,
sono uno studente di informatica e sto realizzando un portale in Ruby On
Rails come tesi di Laurea. L’applicazione, che in parte ho ereditato,
ha un problema che non riesco a risolvere, cosi sto cercando aiuto tra
forum o blogger che trattano ruby.

Questo problema si presenta ogni volta che l’applicazione esegue un
codice javascript. Come mostrato nello screenshot allegato il codice (un
redirect in JS) viene visualizzato in plain/text, wrappato tra un blocco
try-catch.

Il supporto per gli sviluppatori di Google Chrome mi avvisa con questo
messagio: “Resource interpreted as document but transferred with MIME
type text/javascript”

Qualche idea o suggerimento?

Vi ringrazio in anticipo

Il 12 febbraio 2010 12.58, Cristiano X. [email protected] ha scritto:

Il supporto per gli sviluppatori di Google Chrome mi avvisa con questo
messagio: “Resource interpreted as document but transferred with MIME
type text/javascript”

Ma con gli altri browser succede la stessa cosa o no?

pietro

Pietro G. wrote:

Il 12 febbraio 2010 12.58, Cristiano X. [email protected] ha scritto:

Il supporto per gli sviluppatori di Google Chrome mi avvisa con questo
messagio: “Resource interpreted as document but transferred with MIME
type text/javascript”

Ma con gli altri browser succede la stessa cosa o no?

pietro

Salve, ti ringrazio per la risposta velocissima.

Ho provato anche con Mozzila FF ver 3.6 (screenshot allegato) e il
risultato è lo stesso.

Non ho altri browser, ne una versione recente di IE, ma se mi collego su
http://localhost:3000 con “esplora risorse” al momento del login (lo
script dovrebbe proprio fare redirect alla pagina admin una volta
verificati i dati d’accesso) si comporta come se avessi richiesto di
salvare una risorsa e mi ritrovo il codice dello script salvato su file.

ciao Cristiano,

anche se non è la soluzione specifica al tuo problema, se ti occorre il
redirect, potrebbe essere conveniente farlo nel controller, nel tuo caso
dovresti metterlo nel controller che verifica il login:

def action_del_controller
# …
# verifica login
# …
# se il login è ok…
redirect_to admin_url
end

ciao,
A.

Andrea P. wrote:

ciao Cristiano,

anche se non � la soluzione specifica al tuo problema, se ti occorre il
redirect, potrebbe essere conveniente farlo nel controller, nel tuo caso
dovresti metterlo nel controller che verifica il login:

def action_del_controller
# …
# verifica login
# …
# se il login � ok…
redirect_to admin_url
end

ciao,
A.

Grazie Andrea, nel codice che ho postato qui sotto viene utilizzato
proprio il metodo redirect_to, ma dall’oggetto page… non so se questo
ha a che fare con il wrap “try {… }catch(e)” che contiene ogni JS che
viene interpretato come plain-text

Alessandro S. wrote:

Se puoi postare il codice che genera l’errore avrai qualche soluzione
utile! :slight_smile:

Ciao Alessandro, si giustamente!

Questo è il codice all’interno di studente_controller.rb dell’action
login

Metodo utilizzato per l’operazione di “log in” da parte dell’utente

di tipo Studente
def login
session_cleanup

info = remote_check(params[:studente][:matricola], 

params[:studente][:password])
if info.nil?
render :update do |page|
page.alert “Password scorretta!”
end
else
studente = info
student_info = Studentinfo.new(studente)
session[:utente] = student_info
session[:expires_at] = 60.minutes.from_now
session[:user_type] = ‘Studente’
render :update do |page|
page.redirect_to :controller => ‘admin/info’, :action =>
‘home_studente’
end
end
end

Se puoi postare il codice che genera l’errore avrai qualche soluzione
utile! :slight_smile:

Cristiano X. wrote:

  render :update do |page|
    page.redirect_to :controller => 'admin/info', :action => 

‘home_studente’
end

page.redirect_to dovrebbe essere un metodo di prototype_helper.rb in
vendor\railsx\actionpack\lib\action_view\helpers

Non conosco il funzionamento di questo plugin ma dovrebbe permette la
generazione di JS o l’interazione di questi con il controller.

da quello che vedo, stai usando javascript per:

  • segnalare il login corretto/errato
  • redirezionare l’utente

a questo punto ti chiedo: ma non è meglio NON usare javascript per
queste cose? (doppia negazione, sigh!)

puoi risolvere il problema usando l’oggetto flash:

flash[:notice] = “Login corretto…”

oppure

flash[:error] = “Utente/Password errati”

a quel punto nel template (meglio nel layout se lo usi spesso) utilizzi
qualcosa di simile:

<%- flash.each do |name, msg| -%>
<%= content_tag :div, msg, :id => “flash_#{name}” %>
<%- end -%>

nel CSS definisci due selettori:
#flash_notice { }
#flash_error { }

tieni presente che questo metodo funziona anche se JS non è attivato sui
client, ed è anche più pulito :smiley:

quanto a RJS, non ho ancora avuto bisogno di usarlo, quindi non conosco
eventuali problematiche :wink:

ciao,
A.

Andrea P. wrote:

da quello che vedo, stai usando javascript per:

  • segnalare il login corretto/errato
  • redirezionare l’utente

a questo punto ti chiedo: ma non � meglio NON usare javascript per
queste cose? (doppia negazione, sigh!)

puoi risolvere il problema usando l’oggetto flash:

flash[:notice] = “Login corretto…”

oppure

flash[:error] = “Utente/Password errati”

a quel punto nel template (meglio nel layout se lo usi spesso) utilizzi
qualcosa di simile:

<%- flash.each do |name, msg| -%>
<%= content_tag :div, msg, :id => “flash_#{name}” %>
<%- end -%>

nel CSS definisci due selettori:
#flash_notice { }
#flash_error { }

tieni presente che questo metodo funziona anche se JS non � attivato sui
client, ed � anche pi� pulito :smiley:

quanto a RJS, non ho ancora avuto bisogno di usarlo, quindi non conosco
eventuali problematiche :wink:

ciao,
A.

Grazie Andrea, sicuramente sarebbe un modo migliore di gestire il login,
neanche a me fà impazzire l’utilizzo del redirect in JS.

Il mio lavoro però non può mettere in discussione più di tanto le scelte
implementative del portale, questo perché la mia tesi si incentra sul
test di questa piattaforma (anche perché molte di queste scelte iniziali
sono state fatte dal professore).

Questo è il codice all’interno di studente_controller.rb dell’action
login

Metodo utilizzato per l’operazione di “log in” da parte dell’utente

di tipo Studente
def login
session_cleanup

info = remote_check(params[:studente][:matricola],

params[:studente][:password])
if info.nil?

 #render :update do |page|
 # page.alert "Password scorretta!"
 #end
   redirect_to  :controller => 'root/utente', :action => 

‘login_required’
else
studente = info
student_info = Studentinfo.new(studente)
session[:utente] = student_info
session[:expires_at] = 60.minutes.from_now
session[:user_type] = ‘Studente’

 #render :update do |page|
 #  page.redirect_to :controller => 'admin/info', :action => 'home_studente'
 #end
    redirect_to  :controller => 'admin/info', :action => 

‘home_studente’
end
end

Come suggerito da Andrea redirect_to funziona perfettamente, ma questo
non risolve il fatto che nell’applicazione il modulo Prototype_helper di
railsx non viene correttamente eseguito

http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper/JavaScriptGenerator/GeneratorMethods.html

Qualcuno può aiutarmi a comprendere il suo funzionamento?

On 12/02/2010 17:33, Cristiano X. wrote:

Come suggerito da Andrea redirect_to funziona perfettamente, ma questo
non risolve il fatto che nell’applicazione il modulo Prototype_helper di
railsx non viene correttamente eseguito

http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper/JavaScriptGenerator/GeneratorMethods.html

Qualcuno può aiutarmi a comprendere il suo funzionamento?

sembrerebbe che il browser riceva header errati (content-type). se non
erro (ma qui entro in un campo che conosco davvero poco), puoi usare RJS
assieme a richieste AJAX, questo vuol dire che che rails riceve una
richiesta, riconosce che si tratta di una richiesta asincrona e ritorna
il codice JS che viene dato in pasto a qualche eval(). ad occhio e croce
il ragionamento dovrebbe essere quello.

se è questo il problema, credo sia normale e non ha a che fare con RJS o
prototype: la risposta in RJS ha un content-type di tipo text/javascript
di conseguenza il browser non lo esegue, bensì lo prende come un
semplcie file di testo.

per usare javascript per i redirect, dovresti comunque generare una
pagina html che contenga il codice JS al proprio interno.

altrimenti, dovresti far funzionare tutta la fase di login con chiamate
AJAX, a quel punto è probabile che funzioni :wink:

spero di averti aiutato :slight_smile:

ciao,
A.

Non mi è chara una cosa… :login lo chiami con ajax o una post normale?

  • se è ajax puoi far ritornare un oggetto di tipo javascript (e quindi
    fare il redirect)
  • se è una post ritorna un oggetto di tipo html e quindi visto che non è
    incapsulato a dovere il tuo javascript viene mostrato a video.

se la chiamara è ajax in ogn caso ti suggerisco di fare una render
usando un file .rjs piuttosto che spostare la logica della view nel
controller, funziona sicuramente meglio ed anche + corretto

Il 12 febbraio 2010 17.33, Cristiano X. [email protected] ha scritto:

Come suggerito da Andrea redirect_to funziona perfettamente, ma questo
non risolve il fatto che nell’applicazione il modulo Prototype_helper di
railsx non viene correttamente eseguito

consiglio: installa firebug, attivalo, attiva anche il tab “net”, così
vedi tutte le request, anche (e, in questo caso, soprattutto) quelle
ajax.

la cosa più probabile è che ci sia un’eccezione mal gestita da qualche parte.

pietro

Ciao Cristiano,

che si tratti di plain text o javascript, il browser non esegue il
codice,
bensì lo mostra. a conferma di questo, ti è mai capitato di visualizzare un
file javascript/css/txt da browser? lo tratta come un file di testo :wink:

a quanto pare, oltre ai consigli di Alessandro, sembra che quello che ti
ho
detto sia coerente con il tuo problema. semplificando, se usi una form
“classica”, fai una richiesta POST da browser, il controller rails
risponderà, per default, renderizzando un template. se fai una richiesta
POST tramite AJAX, e dal controller usi render_update, tutta
l’operazione
sarà gestita dal javascript: effettua una richiesta asincrona ed attende i
dati in risposta. i dati possono essere HTML da inserire nella pagina o
ulteriore javascript da eseguire.

se vuoi che il JS faccia il redirect, dal controller rails devi
restituire
un template html che al suo interno contenga il codice JS per il
redirect,
ma sempre di una pagina HTML si tratta.

eventualmente, puoi anche usare solo AJAX, ma vuol dire che sia la
chiamata
che la risposta devono essere AJAX, quindi “form_remote_tag” sulla
pagina di
login, e render_update nel controller.

puoi anche creare qualche ibrido, ma significherebbe uscire dai binari
di
rails ed implementare qualcosa di molto specifico :wink:

ciao,
A.

Grazie Pietro, ho scaricato Firebug, da quello che dice il sito sembra
ottimo.

Andrea P. wrote:

se � questo il problema, credo sia normale e non ha a che fare con RJS o
prototype: la risposta in RJS ha un content-type di tipo text/javascript
di conseguenza il browser non lo esegue, bens� lo prende come un
semplcie file di testo.

Grazie Andrea,
ho passato in debug l’applicazione e facendo una brutale ricerca con
“find in files” ho trovato in prototype_helper.rb
(C:\Ruby\lib\ruby\gems\1.8\gems\actionpack-2.1.2)

module GeneratorMethods
def to_s #:nodoc:

        returning javascript = @lines * $/ do
          if ActionView::Base.debug_rjs
            source = javascript.dup
           javascript.replace  " try {\n#{source}\n} catch (e) "
           javascript <<  "{ alert('RJS error:\\n\\n' + e.toString()); alert('#{source.gsub('\\','\0\0').gsub(/\r\n|\n|\r/, "\\n").gsub(/["']/) { |m| "\\#{m}" }}'); throw e }"      
          end
        end
      end

ma anche specificando il content-type con

           Mime::Type.register "application/javascript", :js, %w( application/javascript application/x-javascript )

viene sempre visualizzato come text-plain

Alessandro S. wrote:

Non mi è chara una cosa… :login lo chiami con ajax o una post normale?

  • se è una post ritorna un oggetto di tipo html e quindi visto che non è
    incapsulato a dovere il tuo javascript viene mostrato a video.

Grazie Alessandro,
in effetti credo che hai centrato il problema (non riesco ad essere
molto chiaro, fino a qualche mese fa non conoscevo affatto Ruby, tanto
meno Ajax), ho sostituito

<%= form_remote_tag(:url => {:controller => utente, :action => login})%>

con

e

<%= submit_tag ‘OK’ %>

con

visto che con recenti browser come Chrome o Mozzilla non effettuava
l’operazione di login, ma rimaneva completamente freezato, mentre ora
esegue il login, registra i dati utente in sessione ma non esegue il JS
di redirect alla home.