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

我想在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 * ) 

我知道如何通过每次change()调用的ajax调用来实现这一点,但我认为必须有一种优雅的,希望不显眼的rails方式,每次都不会命中服务器。

任何建议非常感谢

如果您使用的是rails 3.1,则可以利用资产管道对javascript文件进行一些预处理,然后再进行提供。 要执行此操作,只需更改文件扩展名:

 items.js.coffee 

 items.js.coffee.erb 

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

例如,在items_helper.rb中

 def item_price if @item @item.base_price else 0 end end 

编辑:更多关于资产管道:

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

虽然……如果您将Javascript文件作为静态资源提供,这可能不是最佳选择。 我通常在带有变量的HTML的head部分中放置一个script标记。 这样,JS就不必重建,并且浏览器缓存无效。 例如:

    

虽然这样可以将事物保存在各自的命名空间中,但它确实减少了将新Javascript文件发送到客户端的开销。

只是一个想法。

使用资产管道基于每个请求处理带有ERB的CoffeeScript文件可能适用于开发,但它将成为生产中的瓶颈。

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

在页面底部的ERB视图中:

  

始终将脚本放在页面的底部(以及顶部的样式表),因为它会使页面加载时间更快。

我强烈建议您阅读有关如何在Rails视图中安全地引导JSON的文章。 在撰写本文时,最新版本的Rails在以这种方式引导JSON时容易受到XSS攻击。 如果你只有一个简单的数字,那可能不是问题。 但我发现,在人们看到你的代码工作之后,他们倾向于简单地将其复制/粘贴到更复杂的情况而不考虑后果。

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

 

在CoffeeScript中访问它:

 console.log $('#item').data('basePrice')