在rails和javascript中保存一组环境变量

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个常量副本.

谢谢!

Ron*_*era 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。