繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM