首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails/ javascript :如何将rails变量注入(非常)简单的javascript

Rails/ javascript :如何将rails变量注入(非常)简单的javascript
EN

Stack Overflow用户
提问于 2011-09-21 11:30:32
回答 3查看 5.5K关注 0票数 4

我想用rails编写一个非常简单的javascript计算器,它将输入字段的数量乘以存储在rails变量(@item.base_price)中的数字。

因此,在javascript/coffeescript方面,它粗略地是这样的:

代码语言:javascript
运行
复制
# 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方法。

非常感谢您的任何建议

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-21 11:49:27

如果您使用的是rails 3.1,则可以利用assets管道在提供javascript文件之前对其进行一些预处理。为此,只需将文件扩展名从:

代码语言:javascript
运行
复制
items.js.coffee

代码语言:javascript
运行
复制
items.js.coffee.erb

然后,您可以将ruby添加到javascript中,就像在视图中添加<%= %>标记一样。您可能会遇到的唯一问题是,您的items.js文件将被提供给对应用程序的任何控制器方法的每个请求。因此,最好编写一个仅在初始化实例变量时才返回值的辅助方法

例如在items_helper.rb中

代码语言:javascript
运行
复制
def item_price
    if @item
        @item.base_price
    else
        0
    end
end

编辑:有关资产管道的更多信息,请单击此处:

http://guides.rubyonrails.org/asset_pipeline.html

票数 6
EN

Stack Overflow用户

发布于 2011-09-22 02:05:14

尽管..。如果您将Javascript文件作为静态资源提供,这可能不是最佳选择。我通常使用变量在HTML的head部分放置一个script标记。这样,就不必重新构建JS,也不必使其浏览器缓存失效。例如:

代码语言:javascript
运行
复制
<head>
  <script type="text/javascript">
    var myGlobalVariable = <%= @global_js_variable %>;
  </script>
</head>

虽然这不利于将内容保存在单独的名称空间中,但它确实减少了将新的Javascript文件传送到客户端的开销。

这只是个想法。

票数 2
EN

Stack Overflow用户

发布于 2012-11-29 00:38:02

在每个请求的基础上使用asset管道来处理CoffeeScript文件对于开发来说可能是不错的,但在生产中将是一个瓶颈。

在生产中,我使用全局变量或全局变量的特定属性来减少污染。

在页面ERB视图的底部:

代码语言:javascript
运行
复制
<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攻击。如果你只有一个简单的数字,这可能不是问题。但我发现,在人们看到你的代码工作后,他们倾向于简单地将其复制/粘贴到更复杂的情况下,而不考虑后果。

或者,如果您的数据具有自然容器,则可以将其嵌入到数据属性中。

代码语言:javascript
运行
复制
<div id="item" data-base-price="<%=j @item.base_price.to_json.html_safe %>"></div>

在你的CoffeeScript中访问它:

代码语言:javascript
运行
复制
console.log $('#item').data('basePrice')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7494269

复制
相关文章

相似问题

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