2011-12-08 2 views
5

Sto seguendo Railscast #199 per consentire la visualizzazione della mia app Web in un browser mobile. Funziona alla grande, tranne quando cerco di accedere alle informazioni in un'interfaccia a schede usando UJS nella versione mobile. Fare clic sulle schede funziona nell'app Web, ma sul lato mobile viene visualizzato un errore 406. (Ho provato questo dopo aver impostato l'agente utente come iPhone in Safari. Ho anche testato su iOS Simulator e il mio iPhone. Né tempo caricato nulla.)Rails 3: il tipo MIME mobile genera un errore 406 dopo il tentativo di caricare il contenuto con JavaScript

Di seguito è riportato un codice per una delle schede. Qualcuno può aiutarmi a capire cosa sta succedendo? Ecco il mio codice.

Ecco l'azione profile_about in profiles_controller.rb:

def profile_about 
    @profile = Profile.find(params[:id]) 
    respond_to do |format| 
    format.js { render :layout => nil } 
    end 
end 

Nel mio profiles/show.mobile.erb (questo è lo stesso codice esattamente come in profiles/show.html.erb):

<div id="tabs"> 
    <ul id="infoContainer"> 
    <li><%= link_to "Cred", profile_cred_profile_path, :class=> 'active', :remote => true %></li> 
    <li><%= link_to "About", profile_about_profile_path, :class=> 'inactive', :remote => true %></li> 
    </ul> 
    <div id="tabs-1"> 
    <%= render :partial => 'profile_cred' %> 
    </div> 
</div><!-- end tabs --> 

(NOTA: non ho un file per profiles/_profile_about.html.erb e profiles/_profile_about.mobile.erb.)

Ecco il mio profiles/profile_about.js.erb:

$("#tabs-1").html("<%= escape_javascript(render(:partial => 'profile_about'))%>"); 

mio Heroku registra mostra la 406:

2012-03-08T03:02:55+00:00 app[web.1]: Started GET "/profiles/1/profile_about" for 98.218.231.113 at 2012-03-08 03:02:55 +0000 
2012-03-08T03:02:55+00:00 heroku[router]: GET myapp.com/profiles/1/profile_about dyno=web.1 queue=0 wait=0ms service=14ms status=406 bytes=1 
2012-03-08T03:02:55+00:00 app[web.1]: Processing by ProfilesController#profile_about as JS 
2012-03-08T03:02:55+00:00 app[web.1]: Parameters: {"id"=>"1"} 
2012-03-08T03:02:55+00:00 app[web.1]: Completed 406 Not Acceptable in 3ms 
2012-03-08T03:02:55+00:00 heroku[nginx]: 98.218.231.113 - - [08/Mar/2012:03:02:55 +0000] "GET /profiles/1/profile_about HTTP/1.1" 406 1 "http://myapp.com/profiles/1" "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3" myapp.com 

Da esecuzione tail -f logs/development.log:

Started GET "/profiles/1/profile_about" for 127.0.0.1 at Wed Mar 07 22:35:36 -0500 2012 
    Processing by ProfilesController#profile_about as JS 
    Parameters: {"id"=>"1"} 
    PK and serial sequence (5.4ms) SELECT attr.attname, seq.relname 
FROM pg_class seq, 
pg_attribute attr, 
pg_depend dep, 
pg_namespace name, 
pg_constraint cons 
WHERE seq.oid = dep.objid 
AND seq.relkind = 'S' 
AND attr.attrelid = dep.refobjid 
AND attr.attnum = dep.refobjsubid 
AND attr.attrelid = cons.conrelid 
AND attr.attnum = cons.conkey[1] 
AND cons.contype = 'p' 
AND dep.refobjid = '"goals_profiles"'::regclass 
    PK and custom sequence (2.5ms) SELECT attr.attname, 
CASE 
WHEN split_part(def.adsrc, '''', 2) ~ '.' THEN 
substr(split_part(def.adsrc, '''', 2), 
strpos(split_part(def.adsrc, '''', 2), '.')+1) 
ELSE split_part(def.adsrc, '''', 2) 
END 
FROM pg_class t 
JOIN pg_attribute attr ON (t.oid = attrelid) 
JOIN pg_attrdef def ON (adrelid = attrelid AND adnum = attnum) 
JOIN pg_constraint cons ON (conrelid = adrelid AND adnum = conkey[1]) 
WHERE t.oid = '"goals_profiles"'::regclass 
AND cons.contype = 'p' 
AND def.adsrc ~* 'nextval' 

    Profile Load (1.3ms) SELECT "profiles".* FROM "profiles" WHERE "profiles"."id" = '1' LIMIT 1 
Completed 406 Not Acceptable in 30ms 
+0

Sei in ambiente di sviluppo giusto? Cosa dice il log/development.log a proposito del 500? – brutuscat

+0

Appena aggiornato con le informazioni nel mio log quando clicco "about" con un agente utente di iPhone. – tvalent2

risposta

0

Si è scoperto che ciò era dovuto a una mancanza di controllo per una richiesta xhr nel prepare_for_mobile metodo. Ho trovato la risposta in another question. Quindi il seguente metodo prepare_for_mobile consente al JS di funzionare:

def prepare_for_mobile 
    session[:mobile_param] = params[:mobile] if params[:mobile] 
    request.format = :mobile if mobile_device? && !request.xhr? 
end 
0

Ci sono alcuni bug nel codice, forse è solo StackOverflow formattazione qui, ma le citazioni interne dovrebbero essere 'invece di ", in questo modo:

$("#tabs-1").html("<%= escape_javascript(render(:partial => 'profile_about'))%>"); 

E questa linea è casuing vostro errore:

format.mobile.js {render :layout => nil} 

Questo è impossibile perché la richiesta può avere solo un singolo tipo mime. "mobile" o "js", non entrambi. Se stai richiedendo l'azione "profile_about" da javascript, devi rispondere ad essa con js. "format.mobile" deve essere utilizzato solo per il rendering di un modello "profile_about.mobile".

Speriamo che questo sia almeno un passo nella giusta direzione per voi.

+0

Grazie. Ho cambiato il file js.erb in modo che il partial sia circondato da virgolette singole anziché doppie. E ho rimosso 'format.mobile.js'. Tuttavia sto ancora ottenendo un errore '406'. Incollerò ciò che ho nel mio registro sopra come aggiornamento. – tvalent2

0

Probabilmente non rispondere completamente alla tua domanda, ma stavo avendo il problema di stato 406, perché ho distribuito la mia app a PhoneGap! Fondamentalmente è successo perché il tipo di richiesta non corrispondeva a nessuno dei risponditori di Rails nell'azione.

è stato come:

respond_to do |format| 
    format.json { 
    render(json: (@parishes)) 
    } 
end 

Dal momento che ho usato solo per responde a JSON ho cambiato e ora lavora:

render(json:(@parishes)) 

Un modo più completo per affrontare questo è quello di capire esattamente a quale rispondente viene richiesta la richiesta, o predefinita a qualcosa che sai funzionare