[英]Keeping a set of environment variables in rails and javascript
本质上,我们希望保留一组在Rails应用程序和javascript代码中使用的常量。 例如:
{A:3
B:4
C:5}
我们尝试不要在JavaScript中嵌入Rails代码,并且我们不希望有2个常量副本。
谢谢!
将其放在JSON文件中,并解析为您的ruby文件和javascript文件中的文件。
为了避免两次定义常量,我将使用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的开发速度。
我做了类似的事情。
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。
如所写,我的代码仅处理字符串常量。 您可以检查常量的类型并相应地调整输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.