本质上,我们希望在rails应用程序和javascript代码中保留一组常量。例如:在rails和javascript中保留一组环境变量
{A:3
B:4
C:5}
我们尽量不在JavaScript中嵌入rails代码,而且我们不想要2个常量副本。
谢谢!
本质上,我们希望在rails应用程序和javascript代码中保留一组常量。例如:在rails和javascript中保留一组环境变量
{A:3
B:4
C:5}
我们尽量不在JavaScript中嵌入rails代码,而且我们不想要2个常量副本。
谢谢!
为避免定义两次常量,我将使用Rails生成包含常量的JS。我明白想要避免在JS中使用Rails,但正确的代码分离应该涵盖任何此类担忧。
首先,定义在Ruby中的常量,比如在config/environment.rb
或自定义初始化:
CONST_A = 3
CONST_B = 4
CONST_C = 5
然后,创建一个新的控制器,一个动作,其唯一目的是读红宝石值和输出他们作为JavaScript。例如:
class JavascriptsController < ApplicationController
caches_page :constants
def constants
render :template => 'constants.js.erb'
end
end
请注意,该操作是页面缓存以避免不必要的冲击到Rails堆栈。
现在创建视图app/views/javascripts/constants.js.erb
,在其中输出红宝石值作为一个JavaScript对象:
var constants = {
a: <%= CONST_A %>,
b: <%= CONST_B %>,
c: <%= CONST_C %>
};
挂钩一个简单的路线config/routes.rb
用于连接到JavascriptsController
操作:
map.connect '/javascripts/:action.js', :controller => 'javascripts'
最后,在任何其他JS之前将此JS包含在您的布局中:
<%= javascript_include_tag 'constants' %>
这应该做到这一点。该行请求/javascripts/constants.js
,然后定义JS对象constants
。虽然这个JS是使用Rails生成的,但它仍然与应用程序中的其他JS文件分开,并避免重复定义您的常量。
如前所述,您应该缓存JavascriptsController#constants
操作。还考虑缩小constants.js
(即剥离不需要的字符),并将其与其他JavaScript文件连接以减少HTTP请求。我使用AssetHat gem(免责声明:我写了它),它在一些知名网站上成功加速了CSS和JS。
把它放在JSON文件中,并解析它在你的ruby文件中,并在你的JavaScript文件中。
我已经做了类似的事情。
class Constants
DUCK = "Quack"
CAT = "Meow"
PROGRAMMER = "Tap,tap,tap."
def self.make_javascript
output = ""
self.constants.each do |c|
output += "var #{c} = \"#{self.send(c)}\";\n"
end
return output
end
end
然后在你的布局文件,在头写的话:
<script type='text/javascript'>
<%= Constants.make_javascript %>
</script>
,使得它如此加上一个常数,以班会自动添加到的JavaScript。
正如我写的,我的代码只处理字符串常量。您可以检查常量的类型并相应地调整输出。
这里有一点需要注意:任何字符串常量都会导致js中的错误,因为它们不会被引用。可能要将其更改为'a:“<%= CONST_A%>”,等等。 – simmer 2016-04-09 11:33:04