2011-12-08 17 views
5

Estoy siguiendo Railscast #199 para permitir que mi aplicación web se vea en un navegador móvil. Funciona muy bien, excepto cuando trato de acceder a la información en una interfaz con pestañas utilizando UJS en la versión móvil. Al hacer clic en las pestañas funciona en la aplicación web, pero en el lado móvil recibo un error 406. (Intenté esto después de configurar el User Agent como iPhone en Safari. También probé en iOS Simulator y mi iPhone. Ni tiempo cargado nada).Rails 3: tipo MIME móvil arroja un error 406 después de intentar cargar contenido con JavaScript

A continuación se muestra un código para una de las pestañas. ¿Alguien puede ayudarme a enfocarme en lo que está pasando? Aquí está mi código.

Aquí está la acción profile_about en profiles_controller.rb:

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

En mi profiles/show.mobile.erb (esto es exactamente el mismo código como en 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: Tengo un archivo para profiles/_profile_about.html.erb y profiles/_profile_about.mobile.erb.)

Aquí es mi profiles/profile_about.js.erb:

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

Mi Heroku registros que muestra el 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 

Desde correr 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

¿Está usted en el entorno de desarrollo correcto? ¿Qué dice el log/development.log sobre el 500? – brutuscat

+0

Acaba de actualizarse con la información en mi registro cuando hago clic en "acerca de" con un agente de usuario de iPhone. – tvalent2

Respuesta

0

Resulta que esto se debió a una falta de verificación para una solicitud xhr en el prepare_for_mobile método. Encontré la respuesta en another question. Así que el siguiente prepare_for_mobile método permite que el JS para trabajar:

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

Hay algunos errores en su código, tal vez es sólo Stackoverflow formatear aquí, pero las cotizaciones internas deben ser "en lugar de", así:

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

Y esta línea se casuing su error:

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

Esto es imposible porque la solicitud solo puede tener un tipo de mimo único. "móvil" o "js", no ambos. Si está solicitando la acción "profile_about" desde javascript, debe responder de nuevo con js. "format.mobile" solo se debe usar para representar una plantilla "profile_about.mobile".

Afortunadamente, es al menos un paso en la dirección correcta para usted.

+0

Gracias. Cambié el archivo js.erb para que el parcial esté rodeado por comillas simples en lugar de dobles. Y eliminé 'format.mobile.js'. Sin embargo, sigo recibiendo un '406 error'. Pegaré lo que está en mi registro anterior como una actualización. – tvalent2

0

Probablemente no responda completamente a su pregunta, pero estaba teniendo el problema de estado 406, porque he estado implementando mi aplicación en Phonegap. Básicamente sucedió porque el tipo de solicitud no coincidía con ninguno de los respondedores de Rails en la acción.

era como:

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

Ya que sólo lo utilizó para Responde a JSON I cambiado y ahora trabaja:

render(json:(@parishes)) 

Una forma más completa a lidiar con esto es para averiguar exactamente a qué respondedor se le está solicitando esa solicitud, o de forma predeterminada a algo que usted sabe que debe trabajar

Cuestiones relacionadas