2010-03-24 55 views

回答

2

为避免定义两次常量,我将使用Rails生成包含常量的JS。我明白想要避免在JS中使用Rails,但正确的代码分离应该涵盖任何此类担忧。

首先,定义在Ruby中的常量,比如在config/environment.rb或自定义初始化:

CONST_A = 3 
CONST_B = 4 
CONST_C = 5 

然后,创建一个新的控制器,一个动作,其唯一目的是读红宝石值和输出他们作为JavaScript。例如:

class JavascriptsController < ApplicationController 
    caches_page :constants 

    def constants 
    render :template => 'constants.js.erb' 
    end 
end 

请注意,该操作是页面缓存以避免不必要的冲击到Rails堆栈。

现在创建视图app/views/javascripts/constants.js.erb,在其中输出红宝石值作为一个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。

+0

这里有一点需要注意:任何字符串常量都会导致js中的错误,因为它们不会被引用。可能要将其更改为'a:“<%= CONST_A%>”,等等。 – simmer 2016-04-09 11:33:04

3

把它放在JSON文件中,并解析它在你的ruby文件中,并在你的JavaScript文件中。

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。

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