1

Railsは初めてなので、これが正しい方法かどうかはわかりません。いくつかのチェックボックスのAJAXリンクを含むビューがあります。

<% @row_headers.each do |row_header| %>
  <% row_header_ = row_header.gsub(" ", "-") %>
    <%= check_box_tag row_header_, row_header, params.key?(row_header_),
      :data => { :remote => true,
      :url => url_for(
        controller: :web_pages,
        action: :administratorswgraph} %> <%= row_header %>
 <% end %>
<% end %>

これは:administratorswgraphビューから呼び出されています。後で私が持っているファイルで

<% if not @swChart.nil? %>
  <div id="swChart"></div>
  <%= render_chart(@swChart, 'swChart') %>
<% end %>

render_chartはGoogleVisualrライブラリからのものです。私が持っているコントローラーに

def administratorswgraph
  headers = []
  @row_headers.each_with_index do |row_header, i|
    if params.key? row_header.gsub(" ", "-")
      headers.push i
    end
  end
  if headers.empty?
    @swChart = nil
  else
    @swChart = MakeSiteChart(headers, 580, 480)
  end
end

MakeSiteChart関数は、チェックボックスに基づいてGoogleVisualrオブジェクトを返します。私が欲しいのは、チェックボックスの状態が変更されるたびに、新しいチャートが作成されて表示されることです。デバッガーから、チェックボックスの状態が変更されるたびに<%= render_chart(@swChart、'swChart')%>がビューで呼び出されていることがわかりますが、ブラウザーの表示は更新されません。グラフを表示するためにブラウザに表示するにはどうすればよいですか?

編集 私は次の方法を使用してajaxイベントの制御を取得することができました

$('#<%=  @row_headers[0].gsub(" ", "-") %>').on('ajax:success', function(event, xhr, settings) {
  alert("HERE")

});

テストの目的で、最初のチェックボックスを接続するだけです。ただし、引数を解析する方法、グラフを取得する方法、およびそれをDOMに挿入する方法がわかりません。

4

3 に答える 3

0

jQueryなどのjQuery-UJSを使用していると仮定すると、AJAX-Callbacksにフックして、dom内のグラフをサーバーからの応答に置き換えることができます:https ://github.com/rails/jquery-ujs/ wiki / ajax

残念ながら、guides.rubyonrails.orgにはこの良い例はありません...

于 2012-10-24T15:20:06.030 に答える
0

コントローラがRESTfulの場合、web_pages#administratorswgraphは、別々のビューでhtmlとajaxに応答できます(たとえば、administratorswgraph.html.erbとadministratorswgraph.js.erb)。

チャート全体を置き換えるためのすべてのロジックをadministratorswgraph.js.erbに配置します...そこに<%= render_chart(@swChart、'swChart')%>を配置するのに十分だと思いますが、よくわかりません。

于 2012-10-24T17:04:38.980 に答える
0

これをたくさんいじった後、私は満足のいく解決策を思いつくことができました。ビュー内で次のJavaScriptを使用しました

<script type="text/javascript" charset="utf-8" id ="myScript">
  <% @row_headers.each do |row_header| %>
    $('#<%= row_header.gsub(" ", "-") %>').bind('ajax:success', function(event, data, status, xhr) {
      var scripts = $(data).filter('script')
      var chartScript;
      scripts.each(function(index, Element){
        if (Element.text.indexOf("swChart") != -1 && Element.id != "myScript") {
          chartScript = Element.text;
        }
      });
      jQuery.globalEval(chartScript)
    });
  <% end %>
</script>

これにより、ajaxリクエストが戻ってきた後に実行する必要のあるJavaScriptを抽出し、実行することができました。

于 2012-10-24T20:55:33.657 に答える