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

在rails和javascript中保留一组环境变量,javascript,ruby-on-rails,environment-variables,Javascript,Ruby On Rails,Environment Variables,本质上,我们希望保留一组常量,以便在rails应用程序和javascript代码中使用。例如: {A:3 B:4 C:5} class JavascriptsController < ApplicationController caches_page :constants def constants render :template => 'constants.js.erb' end end 我们尽量不在javascript中嵌入rails代码,也不需要两个

本质上,我们希望保留一组常量,以便在rails应用程序和javascript代码中使用。例如:

{A:3
B:4
C:5}
class JavascriptsController < ApplicationController
  caches_page :constants

  def constants
    render :template => 'constants.js.erb'
  end
end
我们尽量不在javascript中嵌入rails代码,也不需要两个常量副本


谢谢

将它放在JSON文件中,并在ruby文件和javascript文件中解析它。

为了避免两次定义常量,我将使用Rails生成包含常量的JS。我知道我想避免在JS中使用Rails,但适当的代码分离应该可以解决任何此类问题

首先,在Ruby中定义常量,例如在
config/environment.rb
或自定义初始值设定项中:

CONST_A = 3
CONST_B = 4
CONST_C = 5
然后,使用单个操作创建一个新的控制器,其唯一目的是读取Ruby值并将其作为JavaScript输出。例如:

{A:3
B:4
C:5}
class JavascriptsController < ApplicationController
  caches_page :constants

  def constants
    render :template => 'constants.js.erb'
  end
end
config/routes.rb
中连接一个简单路由,以连接到
JavascriptsController
操作:

map.connect '/javascripts/:action.js', :controller => 'javascripts'
最后,在布局中包含此JS,然后再添加其他JS:

<%= javascript_include_tag 'constants' %>

应该这样做。此行请求
/javascripts/constants.js
,然后定义js对象
常量。虽然此JS是使用Rails生成的,但它与应用程序中的任何其他JS文件保持独立,并避免重复定义常量


如前所述,您应该缓存
JavascriptsController#常量
操作。还可以考虑小型化<代码>常数.js<代码>(即,删除不需要的字符),并将其与其他JavaScript文件级联以减少HTTP请求。我使用了(免责声明:我写的),它成功地加快了一些知名网站上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中


如前所述,我的代码只处理字符串常量。您可以检查常量的类型,并相应地调整输出。

这里有一个注意事项:任何字符串常量都会在js中导致错误,因为它们将被取消引号。可能需要将其更改为
a::,
等等。