2011-12-08 17 views
5

Tôi đang theo dõi Railscast #199 để cho phép ứng dụng web của tôi được xem trong trình duyệt trên thiết bị di động. Nó hoạt động tốt, ngoại trừ khi tôi cố gắng truy cập thông tin trong một giao diện tab sử dụng UJS trong phiên bản di động. Nhấp vào các tab hoạt động trong ứng dụng web, nhưng ở phía bên thiết bị di động, tôi nhận được lỗi 406. (Tôi đã thử điều này sau khi cài đặt Tác nhân người dùng làm iPhone trong Safari. Tôi cũng đã thử nghiệm trên iOS Simulator và iPhone của tôi. Không phải lúc nào cũng tải bất kỳ thứ gì.)Rails 3: loại MIME di động ném 406 lỗi sau khi thử tải nội dung bằng JavaScript

Dưới đây là một số mã cho một trong các tab. Có ai có thể giúp tôi nhắm vào những gì đang diễn ra không? Đây là mã của tôi.

Đây là hành động profile_about trong profiles_controller.rb:

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

Trong tôi profiles/show.mobile.erb (đây là mã chính xác giống như trong 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 --> 

(Chú ý: Tôi có một tệp cho profiles/_profile_about.html.erbprofiles/_profile_about.mobile.erb.)

Đây là tôi profiles/profile_about.js.erb:

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

Heroku My đăng nhập hiển thị 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 

Từ chạy 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

Bạn đang ở trong môi trường phát triển đúng không? Log/development.log nói gì về 500? – brutuscat

+0

Chỉ cần cập nhật thông tin trong nhật ký của tôi khi tôi nhấp "về" với tác nhân người dùng của iPhone. – tvalent2

Trả lời

0

Tắt điều này là do thiếu kiểm tra yêu cầu xhr trong prepare_for_mobile phương pháp. Tôi đã tìm thấy câu trả lời trong another question. Vì vậy, phương pháp bên dưới prepare_for_mobile cho phép JS hoạt động:

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

Có một vài lỗi trong mã của bạn, có lẽ nó chỉ stackoverflow định dạng ở đây nhưng có dấu ngoặc kép bên trong phải được 'thay cho ", như thế này:

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

Và dòng này được casuing lỗi của bạn:

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

Điều này là không thể vì yêu cầu chỉ có thể có một loại mime duy nhất. "di động" hoặc "js", không phải cả hai. Nếu bạn đang yêu cầu hành động "profile_about" từ javascript, thì bạn phải trả lời lại với js. "format.mobile" chỉ nên được sử dụng để hiển thị mẫu "profile_about.mobile".

Hy vọng đó là ít nhất là một bước đi đúng hướng cho bạn.

+0

Cảm ơn. Tôi đã thay đổi tệp js.erb sao cho phần được bao quanh bởi dấu nháy đơn thay vì gấp đôi. Và tôi đã xóa 'format.mobile.js'. Tuy nhiên tôi vẫn nhận được một lỗi '406'. Tôi sẽ dán nội dung trong nhật ký của tôi ở trên làm bản cập nhật. – tvalent2

0

Có thể không trả lời đầy đủ câu hỏi của bạn nhưng tôi gặp sự cố trạng thái 406, vì tôi đã triển khai ứng dụng của mình sang Phonegap! Điều này về cơ bản đã xảy ra vì loại yêu cầu không khớp với bất kỳ người trả lời Rails nào trong hành động.

nó giống như:

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

Vì tôi chỉ sử dụng nó để responde để JSON tôi đã thay đổi và bây giờ hoạt động:

render(json:(@parishes)) 

Một cách hoàn chỉnh hơn để đối phó với điều này là để tìm chính xác người trả lời được yêu cầu cho yêu cầu đó hoặc mặc định điều gì đó bạn biết để làm việc

Các vấn đề liên quan