5

Railscast#199をフォローして、Webアプリをモバイルブラウザーで表示できるようにしています。モバイル版でUJSを使用してタブ付きインターフェイスで情報にアクセスしようとする場合を除いて、これはうまく機能します。タブをクリックするとWebアプリでは機能しますが、モバイル側では406エラーが発生します。(SafariでユーザーエージェントをiPhoneとして設定した後、これを試しました。iOSシミュレーターとiPhoneでもテストしました。どちらの時間も何もロードされませんでした。)

以下は、タブの1つのコードです。誰かが私が何が起こっているのかをターゲットにするのを手伝ってくれる?これが私のコードです。

これがprofile_aboutアクションですprofiles_controller.rb

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

私のprofiles/show.mobile.erb場合(これはとまったく同じコードです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 -->

(注:とのファイルがprofiles/_profile_about.html.erbありprofiles/_profile_about.mobile.erbます。)

これが私のprofiles/profile_about.js.erb

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

406を示す私のHerokuログ:

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

実行から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
4

3 に答える 3

0

おそらくあなたの質問に完全には答えないでしょうが、私は自分のアプリをPhonegapにデプロイしているので、406ステータスの問題を抱えていました!これは基本的に、リクエストタイプがアクション内のどのRailsレスポンダーとも一致しなかったために発生しました。

それは次のようなものでした:

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

JSONに応答するためにのみ使用したので、変更して機能するようになりました。

    render( json:(@parishes) )

これに対処するためのより完全な方法は、その要求に対してどのレスポンダーが要求されているかを正確に把握するか、デフォルトで動作することがわかっているものをデフォルトにすることです。

于 2012-08-18T08:16:25.823 に答える
0

コードにはいくつかのバグがあります。おそらくここではスタックオーバーフローのフォーマットですが、内側の引用符は次のように「」ではなく「」にする必要があります。

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

そして、この行はあなたのエラーを引き起こしています:

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

リクエストは単一のmimeタイプしか持てないため、これは不可能です。「mobile」または「js」、両方ではありません。javascriptから「profile_about」アクションをリクエストしている場合は、jsで応答する必要があります。「format.mobile」は、「profile_about.mobile」テンプレートをレンダリングするためにのみ使用する必要があります。

うまくいけば、それはあなたにとって正しい方向への少なくとも一歩です。

于 2012-02-08T14:51:42.613 に答える
0

これは、メソッドのxhrリクエストのチェックが不足していることが原因であることが判明しましたprepare_for_mobile別の質問で答えを見つけました。したがって、以下のprepare_for_mobile方法でJSを機能させることができます。

def prepare_for_mobile
  session[:mobile_param] = params[:mobile] if params[:mobile]
  request.format = :mobile if mobile_device? && !request.xhr?
end
于 2013-01-19T15:12:08.487 に答える