基本上,我们希望保留一组常量,以便在rails app和javascript代码中使用。例如:
{A:3
B:4
C:5}
我们尽量不在javascript中嵌入rails代码,我们不需要2个常量副本。
谢谢!
答案 0 :(得分:3)
将它放在JSON文件中并在你的ruby文件中解析它,并在你的javascript文件中解析它。
答案 1 :(得分:2)
为了避免两次定义常量,我会使用Rails生成包含常量的JS。我理解想避免在JS中使用Rails,但正确的代码分离应该涵盖任何这样的担忧。
首先,在Ruby中定义常量,例如在config/environment.rb
或自定义初始值设定项中:
CONST_A = 3
CONST_B = 4
CONST_C = 5
然后,使用单个操作创建一个新控制器,其唯一目的是读取Ruby值并将其作为JavaScript输出。例如:
class JavascriptsController < ApplicationController
caches_page :constants
def constants
render :template => 'constants.js.erb'
end
end
请注意,该操作是页面缓存的,以避免对Rails堆栈进行不必要的命中。
现在创建视图app/views/javascripts/constants.js.erb
,在其中输出Ruby值作为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。
答案 2 :(得分:1)
我做了类似的事情。
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中。
如上所述,我的代码只处理字符串常量。您可以检查常量的类型并相应地调整输出。