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

时间:2010-03-24 22:45:57

标签: javascript ruby-on-rails environment-variables

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

{A:3
B:4
C:5}

我们尽量不在javascript中嵌入rails代码,我们不需要2个常量副本。

谢谢!

3 个答案:

答案 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中。

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