首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法显示程序计算出来的数据。

无法显示程序计算出来的数据。
EN

Stack Overflow用户
提问于 2013-09-12 07:13:55
回答 3查看 519关注 0票数 0

在这个问题上困了几天,已经问了一个问题。

我有一个应用程序,它显示石油/天然气钻井的数据,用户可以在其中输入他们认为钻井可能找到的不同的估计值。应用程序正确地计算计算输入中任何更改的结果。但是,结果不会显示在屏幕上,部分结果。这就是我想纠正的错误。

使用google工具,我可以看到计算结果,文件drills.js.coffee中的行“drills.js.coffee数据”生成控制台上的JSON响应对象、对象和对象,这些对象(即正确的术语)存在并包含适当的数据。

我已经从模块中添加了相关的代码。参见以下:控制器-App/Asset/Javascript-2视图-以及视图文件视图/projection.js.erb文件(见底部)

我已经/正在尝试各种方法来显示结果。其中包括

任何帮助都是很棒的,包括指出一些我正试图做的事情,这是没有意义的。

(1)在app/assts/Javascript drills.js.erb中尝试这样做。这是我试图从控制器操练动作投影中得到填充了正确值的部分重新显示的行。

代码语言:javascript
复制
$('#id_evaluation_results').html("<%= j render(:partial => '/evaluation_results') %>")

不呈现显示在屏幕上的文本“<%= escape_javascript呈现(:分部=>‘/估价_=>’) %>”中的部分和结果。将双引号“更改为单引号”将导致错误SyntaxError:意外的COMPOUND_ASSIGN (in /SyntaxError/f COMPOUND_ASSIGN)--添加行

(2)我创建了一个文件视图/演练/projection.js.erb

代码语言:javascript
复制
$('#id_evaluation_results').html('<%= escape_javascript(render :partial => "drills/evaluation_results") %></div>');

我不相信这个文件被评估为在文件中有故意的错误,似乎不会造成任何问题。

谢谢-皮埃尔

代码如下

drills_controller

代码语言:javascript
复制
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

结束

App/Asset/Javascript/drills.js.咖啡

代码语言:javascript
复制
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 

视图/演练/Investor.html.erb--这是包含部分evaluation_results的主屏幕

代码语言:javascript
复制
<% 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>

视图/演练/评估结果.

代码语言:javascript
复制
<%= 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。这个文件名为与应该触发它的控制器的操作相匹配。

代码语言:javascript
复制
$('#id_evaluation_results').html('<%= escape_javascript(render :partial => "drills/evaluation_results") %></div>');
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-12 07:47:46

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

  1. app/assets/javascript/drills.js.coffee包含erb代码(封装在<%= %>中的代码),但没有由erb预处理:必须在文件名中在.coffee之后添加.erb才能添加erb预处理程序。
  2. 我认为您误解了预处理器的功能:在drill.jsprojection.js中,当加载javascript文件时(即在页面加载的最开始),erb只会被解释一次。

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

如果您想动态加载部分数据并将新数据绑定到它,您必须处理另一种方式,比如向返回分部为html的动作发出ajax请求,并将其注入DOM中,或者使用类似于胡子的东西在客户端拥有一个模板,并将json响应绑定到它。

直接加载html

这里,您没有使用json进行响应,而是直接使用所需的html进行响应。不要忘记在您的控制器中禁用布局呈现,使用render 'your_action', layout: false

代码语言:javascript
复制
loadAssumptionChange = (drill_id)->
  data = $('#evaluation_assumption_params').serialize()
  $.post( "/drills/#{drill_id}/projection", ( resp ) =>
     $('#id_evaluation_results').html( resp )
  )

这种技术的优点是它的实现相当简单。

缺点是,如果加载大量html (客户端可以更有效地处理模板,而只是从服务器端传输json数据),则性能较差,而且您现在有了一个专门用于此客户端行为的操作(例如,不能对api重用动作)。

我倾向于认为这比其他选择要“干净”一点。

把json装到胡子上

在这里,您可以将模板作为胡子脚本添加到页面中,只从服务器加载json数据并在客户端呈现模板。

在您的视图文件中,您将看到这样的内容:

代码语言:javascript
复制
<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中这样使用它:

代码语言: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数据传递)。

要了解更多关于客户端胡子的知识,看那边

票数 1
EN

Stack Overflow用户

发布于 2013-09-12 07:24:16

也许问题在于双引号?

代码语言:javascript
复制
$('#id_evaluation_results').html(<%= j render(:partial => '/evaluation_results') %>)
票数 1
EN

Stack Overflow用户

发布于 2013-09-12 07:47:14

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

尽管如此,您肯定可以使用projection.js.erb中的代码呈现更新的部分,因为它将在控制器操作之后调用。从我目前在代码中看到的情况来看,它目前可能没有被调用,因为您需要显式地告诉Rails响应javascript,如下所示:

代码语言: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模板)

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18757767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档