0

この問題に何日も立ち往生しており、それに関してすでに1つの質問をしました。

私は、石油/ガス掘削のデータを表示するアプリケーションを持っています。このアプリケーションでは、掘削で発見されると思われるもののさまざまな見積もりをユーザーが入力できます。アプリケーションは、計算入力の変更に対して結果を正しく計算します。ただし、結果の一部が画面に表示されません。これは私が修正しようとしているエラーです。

Google Chrome 開発者ツールを使用すると、結果が計算され、ファイル drills.js.coffee の「console.log data」行が、コンソールとこれらのオブジェクトで JSON 応答 [オブジェクト、オブジェクト、オブジェクト] を生成することがわかります (つまり、正しい用語)が存在し、適切なデータが含まれています。

モジュールから関連するコードを追加しました。以下を参照してください: Controller - App/Assets/Javascript - 2 Views - ビュー ファイル内 view/projection.js.erb ファイル (下部を参照)

結果を表示するためにあらゆる種類の方法を試しました/試しています。これらには以下が含まれます

私がやろうとしていることが意味をなさないことを指摘するなど、どんな助けも素晴らしいでしょう。

(1) app/assts/Javascript drills.js.erb 内でそうしようとしています。これは、コントローラーのドリル アクション プロジェクションから正しい値を入力して再表示するパーシャルを取得しようとする行です。

$('#id_evaluation_results').html("<%= j render(:partial => '/evaluation_results') %>")

パーシャルをレンダリングせず、テキスト " <%= escape_javascript render(:partial => '/evaluation_results') %> " が画面に表示されます。二重引用符 " を単一引用符 ' に変更すると、エラー SyntaxError: unexpected COMPOUND_ASSIGN (/Volumes/F Drive/drill_investor/app/assets/javascripts/drills.js.coffee) が発生します 行の追加

(2) ファイル views/drills/projection.js.erb を作成しました

$('#id_evaluation_results').html('<%= escape_javascript(render :partial => "drills/evaluation_results") %></div>');

このファイルは、意図的なエラーを作成しても問題が発生していないように見えると評価されているとは思いません

ありがとう - ピエール

以下のコード

drills_controller

class DrillsController < ApplicationController
  before_filter :load_drill, except: [:index, :new, :create]

  def investor
  end

  def projection

    result_list = Evaluation.generate_projection(@drill.drill_interests, assumption_params)
    @result_list= result_list    # this line probably not necessary
  render json: result_list

終わり

アプリ/アセット/Javascript/drills.js.coffee

loadAssumptionChange = (drill_id)->
  data = $('#evaluation_assumption_params').serialize()
  console.log data
  $.ajax
    # event.preventDefault()
    url:"/drills/#{drill_id}/projection.json"
    type:"post"
    dataType: 'json'   # data type of response
    data: data
    success: (data,success,xhr)->
      console.log("print data")
      console.log data

     $('#id_evaluation_results').html("<%= j render(:partial => '/evaluation_results') %>")
     # this line not working 

views/drills/investor.html.erb - これは部分的な評価結果を含むメイン画面です

<% content_for :title, "Drill Investor - Valuations" %>
    <div class="form assumption" data-drillid="<%= @drill.id %>">
      <%= render 'assumption_params' %>
    </div>
    <div class="form">
      <div id="id_evaluation_results">
        <%= render 'evaluation_results' %>
      </div>
    </div>       
  </article>
</section>

ビュー/ドリル/evaluation_results.html.erb

<%= simple_form_for :result_list, :html => { class: 'infogroup', id: "evaluation_results",
      :method => :post }, remote: true do |f| %>
  <%= content_tag :header, "Results", class: 'infogroup-header'%>  
  ...
        <th>Discovery Value</th>
        <th>DV/Share</th>
        <th>Leverage</th>
        <th>Risked Lev </th>
        <th>Leverage with CFD's</th>
      </tr>
      <% if @result_list.present? %>
        <% @result_list.each do |result| %>                 
          ....
              <td><%= result.listing_name %></td>
              <td><%= number_to_currency(result.listing.share_price_dollars,
                  :precision => 3, :delimiter => ',')     %></td>
              <td><%= number_to_currency(result.market_capitalisation / 1000000,
                  :precision => 0, :delimiter => ',')     %>M</td>

ビュー/ドリル/projection.js.erb. このファイルは、それをトリガーする必要があるコントローラーからのアクションに一致する名前が付けられています

$('#id_evaluation_results').html('<%= escape_javascript(render :partial => "drills/evaluation_results") %></div>');
4

3 に答える 3

1

おそらく問題は二重引用符にあるのでしょうか?

$('#id_evaluation_results').html(<%= j render(:partial => '/evaluation_results') %>)
于 2013-09-12T07:24:16.040 に答える
1

js.erb ではないため、drills.js.coffee 内で erb を使用できるとは思いません (したがって、<%= #ruby コード %> を解釈する方法がわかりません)。

そうは言っても、コントローラー アクションの後に呼び出されるため、project.js.erb にあるコードを使用して、更新されたパーシャルを確実にレンダリングできます。私が現在コードで見ていることから、次のように JavaScript に応答するように Rails に明示的に指示する必要があるため、現在呼び出されていない可能性があります。

 def projection
    @result_list = Evaluation.generate_projection(@drill.drill_interests, assumption_params)
    respond_to do |format|
      format.json { render :json => @result_list }
      format.js
    end
 end

最初の format.json は、Rails に @result_list を JSON オブジェクトとしてレンダリングするように指示します (これは通常、API 経由で使用されます。この場合、drills.js.coffee での最初の $.ajax 呼び出しで使用されます。後者の format.js はその後、Railsにprojection.js.erbテンプレートをレンダリングするように指示するために使用されます

お役に立てれば!

于 2013-09-12T07:47:14.943 に答える
1

あなたのコードには 2 つの潜在的な問題があります。

  1. app/assets/javascript/drills.js.coffeeerb コード ( にカプセル化されたコード<%= %>) が含まれていますが、erb によって前処理されていません: erb プリプロセッサを追加するには、ファイル名に.erbafterを追加する必要があります.coffee
  2. プリプロセッサの機能を誤解していると思います:drill.jsprojection.jsでは、erb は、javascript ファイルがロードされたとき (つまり、ページのロードの最初の時点) に 1 回だけ解釈されます。

スクリプトがロードされたときにerbがデータを計算すると、データは決して変更されません。これは前処理であり、ランタイム処理ではありません。

パーシャルをロードしてその場で新しいデータをバインドする場合は、パーシャルを html として返すアクションに ajax リクエストを作成し、それを DOM に挿入するか、口ひげのようなものを使用するなど、別の方法で処理する必要があります。クライアント側にテンプレートを用意し、それに json レスポンスをバインドします。

html を直接読み込む

ここでは、json で応答する代わりに、必要な html で直接応答します。を使用して、コントローラーでレイアウトのレンダリングを無効にすることを忘れないでくださいrender 'your_action', layout: false

loadAssumptionChange = (drill_id)->
  data = $('#evaluation_assumption_params').serialize()
  $.post( "/drills/#{drill_id}/projection", ( resp ) =>
     $('#id_evaluation_results').html( resp )
  )

この手法の利点は、実装が非常に簡単なことです。

不利な点は、大量の html をロードするとパフォーマンスが低下すること (サーバー側から json データを転送するだけで、クライアント側はテンプレートをより効率的に処理できる) と、このクライアント側の動作専用のアクション (action can'たとえば、API に再利用できません)。

これは、代替案よりも少し「クリーン」であると考える傾向があります。

口ひげにバインドされたjsonをロードしています

ここでは、ページにテンプレートを口ひげスクリプトとして追加し、サーバーから json データのみを読み込み、クライアント側でテンプレートをレンダリングします。

ビューファイルには、次のようなものがあります。

<script type="text/mustache" id="results_template">
  <table>
    <thead>
      <tr>
        <th>Discovery Value</th>
        <th>DV/Share</th>
        <th>Leverage</th>
        <th>Risked Lev </th>
        <th>Leverage with CFD's</th>
      </tr>
    </thead>

    <tbody>
      {{#results}}
        <td>{{name}}</td>
        <td>{{price}}</td>
        <td>{{market_capitalisation}}</td>
      {{/results}
    </tbody>
  </table>
</script>

事前にフォーマットされたすべてのもの (価格など) を使用して json 応答をレンダリングし、javascript でそのように使用します。

loadAssumptionChange = (drill_id)->
  data = $('#evaluation_assumption_params').serialize()

  $.ajax
    url:"/drills/#{drill_id}/projection.json"
    type:"post"
    dataType: 'json'   # data type of response
    data: data
    success: (data,success,xhr)->
      template = $( '#results_template' ).html()
      $('#id_evaluation_results').html( Mustache.render( template, data ) )

利点は、クリーンで再利用可能であり、膨大な量のデータを問題なくレンダリングできることです (ブラウザーがすべてのハードワークを行い、それが非常に得意です)。

欠点は、実装がより困難/長いことと、ビュー ヘルパーを使用できないことです (json 応答の作成中にビュー ヘルパーを使用し、ヘルパーの書式設定が必要な値を json データとして渡す必要があります)。

クライアント側の口ひげの詳細については、そこを参照してください。

于 2013-09-12T07:47:46.943 に答える