我想用rails编写一个非常简单的javascript计算器,它将输入字段的数量乘以存储在rails变量(@item.base_price)中的数字。
因此,在javascript/coffeescript方面,它粗略地是这样的:
# app/assets/javascript/items.js.coffee
$ ->
$('#item_quantity').change ->
quantity_val = $(this).val()
$('#total_amount').html(quantity_val * <%= I_WANT_@ITEM.BASE_PRICE_HERE %>)
我知道如何在每次change()调用时通过ajax调用来做到这一点,但我认为必须有一种优雅的、希望不会影响服务器的rails方法。
非常感谢您的任何建议
发布于 2011-09-21 11:49:27
如果您使用的是rails 3.1,则可以利用assets管道在提供javascript文件之前对其进行一些预处理。为此,只需将文件扩展名从:
items.js.coffee
至
items.js.coffee.erb
然后,您可以将ruby添加到javascript中,就像在视图中添加<%= %>
标记一样。您可能会遇到的唯一问题是,您的items.js文件将被提供给对应用程序的任何控制器方法的每个请求。因此,最好编写一个仅在初始化实例变量时才返回值的辅助方法
例如在items_helper.rb中
def item_price
if @item
@item.base_price
else
0
end
end
编辑:有关资产管道的更多信息,请单击此处:
http://guides.rubyonrails.org/asset_pipeline.html
发布于 2011-09-22 02:05:14
尽管..。如果您将Javascript文件作为静态资源提供,这可能不是最佳选择。我通常使用变量在HTML的head
部分放置一个script
标记。这样,就不必重新构建JS,也不必使其浏览器缓存失效。例如:
<head>
<script type="text/javascript">
var myGlobalVariable = <%= @global_js_variable %>;
</script>
</head>
虽然这不利于将内容保存在单独的名称空间中,但它确实减少了将新的Javascript文件传送到客户端的开销。
这只是个想法。
发布于 2012-11-29 00:38:02
在每个请求的基础上使用asset管道来处理CoffeeScript文件对于开发来说可能是不错的,但在生产中将是一个瓶颈。
在生产中,我使用全局变量或全局变量的特定属性来减少污染。
在页面ERB视图的底部:
<script>
//<![CDATA[
window.MyApp = window.MyApp || {};
window.MyApp.itemBasePrice = <%=j @item.base_price.to_json.html_safe %>;
//]]>
</script>
始终将脚本放在页面的底部(样式表放在顶部),因为这会加快页面加载速度。
我强烈推荐阅读How to securely bootstrap JSON in a Rails view上的这篇文章。在撰写本文时,最新版本的Rails在以这种方式引导JSON时容易受到XSS攻击。如果你只有一个简单的数字,这可能不是问题。但我发现,在人们看到你的代码工作后,他们倾向于简单地将其复制/粘贴到更复杂的情况下,而不考虑后果。
或者,如果您的数据具有自然容器,则可以将其嵌入到数据属性中。
<div id="item" data-base-price="<%=j @item.base_price.to_json.html_safe %>"></div>
在你的CoffeeScript中访问它:
console.log $('#item').data('basePrice')
https://stackoverflow.com/questions/7494269
复制相似问题