0

几天以来一直在这个问题上停留,并且已经提出了一个关于它的问题。

我有一个显示石油/天然气钻探数据的应用程序,用户可以在其中输入他们认为钻探可能发现的不同估计值。应用程序正确计算计算输入的任何变化的结果。但是,结果不显示在部分结果的屏幕上。这是我要修复的错误。

使用 google chrome 开发人员工具,我可以看到计算结果,并且文件 Drills.js.coffee 中的“console.log 数据”行在控制台和这些对象上生成 JSON 响应 [Object, Object, Object](是正确的术语)存在并包含适当的数据。

我已经从模块中添加了相关的代码。见下文: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 (in /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

我不相信您将能够在 Drills.js.coffee 中使用 erb,因为它不是 js.erb(因此不知道如何解释您的 <%= #ruby code %>。

话虽如此,您绝对可以使用 project.js.erb 中的代码渲染更新的部分,因为它将在控制器操作之后调用。从我目前在代码中看到的情况来看,它可能当前没有被调用,因为您需要明确告诉 Rails 像这样响应 javascript:

 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

我在您的代码中看到两个潜在问题:

  1. app/assets/javascript/drills.js.coffee包含 erb 代码(封装在 中的代码<%= %>)但未被 erb 预处理:您必须在文件名中添加.erbafter.coffee以添加 erb 预处理器
  2. 我认为您误解了预处理器的作用:在加载 javascript 文件时(即在页面加载的最开始),在drill.jsand中,erb 只会被解释一次projection.js

一旦 erb 在加载脚本时计算出数据,它就永远不会改变:这是预处理,而不是运行时处理。

如果您想加载一个部分并将新数据动态绑定到它,您必须以其他方式处理,例如向一个将您的部分返回为 html 的操作发出 ajax 请求并将其注入 DOM 或使用类似 mustache 的东西在客户端有一个模板并将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 数据)并且您现在有一个专门用于此客户端行为的操作(操作可以' t 被重用于 api,例如)。

我倾向于认为这比替代方案更“干净”。

加载绑定到 mustache 的 json

在这里,您将模板作为 mustache 脚本添加到页面中,仅从服务器加载 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 回答