min*_*eow 5 javascript ruby-on-rails environment-variables
实际上,我们希望保留一组常量,以便在rails app和javascript代码中使用.例如:
{A:3
B:4
C:5}
Run Code Online (Sandbox Code Playgroud)
我们尽量不在javascript中嵌入rails代码,我们不想要2个常量副本.
谢谢!
为了避免两次定义常量,我将使用 Rails 生成包含常量的 JS。我理解想要避免在 JS 中使用 Rails,但正确的代码分离应该可以消除任何此类担忧。
首先,在 Ruby 中定义常量,例如在自定义初始值设定项中config/environment.rb或在自定义初始值设定项中:
CONST_A = 3
CONST_B = 4
CONST_C = 5
Run Code Online (Sandbox Code Playgroud)
然后,使用单个操作创建一个新控制器,其唯一目的是读取 Ruby 值并将其输出为 JavaScript。例如:
class JavascriptsController < ApplicationController
caches_page :constants
def constants
render :template => 'constants.js.erb'
end
end
Run Code Online (Sandbox Code Playgroud)
请注意,该操作是页面缓存的,以避免对 Rails 堆栈进行不必要的访问。
现在创建视图app/views/javascripts/constants.js.erb,在其中将 Ruby 值输出为 JavaScript 对象:
var constants = {
a: <%= CONST_A %>,
b: <%= CONST_B %>,
c: <%= CONST_C %>
};
Run Code Online (Sandbox Code Playgroud)
连接一个简单的路由config/routes.rb来连接到JavascriptsController操作:
map.connect '/javascripts/:action.js', :controller => 'javascripts'
Run Code Online (Sandbox Code Playgroud)
最后,在布局中将此 JS 包含在任何其他 JS 之前:
<%= javascript_include_tag 'constants' %>
Run Code Online (Sandbox Code Playgroud)
应该可以做到这一点。这一行请求/javascripts/constants.js,然后定义 JS 对象constants。虽然此 JS 是使用 Rails 生成的,但它与应用程序中的任何其他 JS 文件保持独立,并避免了常量的重复定义。
如前所述,您应该缓存该JavascriptsController#constants操作。还可以考虑缩小constants.js(即去除不需要的字符)并将其与其他 JavaScript 文件连接以减少 HTTP 请求。我使用AssetHat gem(免责声明:我写的),它已经成功地加速了一些知名网站上的 CSS 和 JS。