在这个问题上困了几天,已经问了一个问题。
我有一个应用程序,它显示石油/天然气钻井的数据,用户可以在其中输入他们认为钻井可能找到的不同的估计值。应用程序正确地计算计算输入中任何更改的结果。但是,结果不会显示在屏幕上,部分结果。这就是我想纠正的错误。
使用google工具,我可以看到计算结果,文件drills.js.coffee中的行“drills.js.coffee数据”生成控制台上的JSON响应对象、对象和对象,这些对象(即正确的术语)存在并包含适当的数据。
我已经从模块中添加了相关的代码。参见以下:控制器-App/Asset/Javascript-2视图-以及视图文件视图/projection.js.erb文件(见底部)
我已经/正在尝试各种方法来显示结果。其中包括
任何帮助都是很棒的,包括指出一些我正试图做的事情,这是没有意义的。
(1)在app/assts/Javascript drills.js.erb中尝试这样做。这是我试图从控制器操练动作投影中得到填充了正确值的部分重新显示的行。
$('#id_evaluation_results').html("<%= j render(:partial => '/evaluation_results') %>")不呈现显示在屏幕上的文本“<%= escape_javascript呈现(:分部=>‘/估价_=>’) %>”中的部分和结果。将双引号“更改为单引号”将导致错误SyntaxError:意外的COMPOUND_ASSIGN (in /SyntaxError/f COMPOUND_ASSIGN)--添加行
(2)我创建了一个文件视图/演练/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结束
App/Asset/Javascript/drills.js.咖啡
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的主屏幕
<% 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>视图/演练/评估结果.
<%= 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>');发布于 2013-09-12 07:47:46
我在您的代码中看到了两个潜在的问题:
app/assets/javascript/drills.js.coffee包含erb代码(封装在<%= %>中的代码),但没有由erb预处理:必须在文件名中在.coffee之后添加.erb才能添加erb预处理程序。drill.js和projection.js中,当加载javascript文件时(即在页面加载的最开始),erb只会被解释一次。一旦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数据),则性能较差,而且您现在有了一个专门用于此客户端行为的操作(例如,不能对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-12 07:24:16
也许问题在于双引号?
$('#id_evaluation_results').html(<%= j render(:partial => '/evaluation_results') %>)发布于 2013-09-12 07:47:14
我不相信您能够在drills.js.coffee中使用erb,因为它不是js.erb (因此不知道如何解释<%= #ruby代码%>。
尽管如此,您肯定可以使用projection.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模板)
希望这能有所帮助!
https://stackoverflow.com/questions/18757767
复制相似问题