1

モバイルと HTML の両方の形式のアプリケーションがあります。

フォームには、リモート Web サービスによって計算された値を入力する必要があるフィールドがあります。jquery では、$(post) API を使用して、Web サービスを呼び出すコントローラー アクションを呼び出します。

    $.post(url, $(this).serialize(), null, "script");

コントローラーはインスタンス変数を計算します...

@myvar = myvalue
....
respond_to do |format|
  format.js 
end

次に、.js.erb テンプレートを返します。フォームのフィールドの値を設定する場所

$('#mymodel_myfield').val('<%= @myvar %>');

これはhtmlの魅力のように機能しますが、Mobylette gemでJquery Mobileを使用しているモバイルビューでは機能しません。

rails は .mobile.erb ファイルを想定しているため、js.erb テンプレートの jquery 関数は実行されません。

また、モバイル ビューに別のアプローチを使用しようとしています。つまり、json または html データ型で $.post を呼び出し、コールバック関数を使用して jqm ビューに .mobile.erb テンプレートを挿入しますが、方法が見つかりません。それは働いています。

ヒントはありますか?

4

1 に答える 1

0

わかりました、少し異なるアプローチを使用しましたが、問題は解決しました。

注:モバイルブラウザにはfirebugがないため、レールからモバイルデバイスに送信されたものを確認するにはwiresharkを使用する必要がありました....ブラウザに送り返されたデータを見ると、解決策が明らかになりました、json文字列のみを受け取ることを期待していたのに、応答にアプリケーションレイアウトが含まれていることがわかりました。

1) コントローラー アクションを呼び出すために使用される jqm 形式のボタンは次のとおりです。

<div class="ui-block-c">
  <%= link_to "compute", '#', class: 'compute-myval',:"data-role" => "button", :"data-ajax" => false  %>
</div>

2) コントローラー アクションは結果をインスタンス変数に保存し、respond_to json (コントローラー名は「visits_controller」、コントローラー アクションは「compute」)

@total = "value returned from web service"
...
respond_to do |format|
  format.js     #used for HTML views
  format.json
end

3) という名前のビューがあります

app/views/visits/compute.json.erb

その内容は

{ "total": "<%= @total %>" }

4)ボタンが押されたときに実行されるjqueryコードは

$('form').on('click', '.compute-myval', function(event) {
  var url;
  url='/visit/compute';
  url += '/' + $('#visit_field1').val();
  url += '/' + $('#visit_field2').val();
  url += '/' + $('#visit_field3').val();
  $.ajax( {
    url: url,
    data: $(this).serialize(),
    success: function (mydata) {
      $('#visit_resultfield').val(mydata.total);
    },
    dataType: 'json'
  });
  return event.preventDefault();
});

5) :mobile 形式を管理するには、Mobylette gem を使用します。Ajax 経由でトリガーされるコントローラー アクションがモバイル フォーマットを使用し、application.mobile.erb テンプレートが適用されることを回避するために、Mobylette 用にいくつかの構成をセットアップする必要がありました (application_controller.rb 内)。

include Mobylette::RespondToMobileRequests
mobylette_config do |config|
  config[:skip_xhr_requests] = false
  config[:fallback_chains] = { mobile: [:mobile, :html, :json] }
end

他に必要なのは、app/layouts の下に、1 行だけを含む application.json.erb という名前のファイルを用意することです。

<%= yield %>

したがって、compute.mobile.erb ビューがなく、フォールバックが :json であり、テンプレートが何も追加しないため、機能します。

6) Rails ログの出力は次のとおりです。

Started GET "/visit/compute/3/78/66" for 192.168.1.7 at 2012-12-22 00:13:35 +0100
Processing by VisitsController#compute as JSON
  Parameters: {"field1"=>"3", "field2"=>"78", "field3"=>"66"}
  Rendered visits/compute.json.erb within layouts/application (0.1ms)
Completed 200 OK in 1335ms (Views: 5.4ms | ActiveRecord: 1.0ms)

7) Jqm フォームのフィールド "resultfield" に合計値が入力されます。

任務完了...

于 2012-12-22T00:19:06.653 に答える