我在Javascript文件中需要一些设置 - 连接到的服务器 - 根据我的环境进行更改。对于development
,test
和staging
,我想使用登台服务器;对于production
,生产服务器。我已经拥有Ruby中的设置(在我的environment/xyz.rb
文件中配置)。到目前为止,我一直在请求时使用application.js.erb
文件和自定义路由动态创建JS文件。但这很慢,这意味着只为这个文件创建一个额外的控制器和视图目录。
我更希望有一个模板文件和一个rake任务,从模板生成正确的版本,并将静态文件放在public/javascripts
目录中。有没有人尝试过这样的东西?你用什么渲染?你把模板文件和渲染代码放在哪里了?
或者保持动态版本并将其缓存在生产中是否更好?
答案 0 :(得分:3)
你能做这样的事吗?
<% javascript_include_file "#{RAILS_ENV}.js" %>
我做了类似的事情,虽然它不是JS文件,而是有一些RB文件......我出于同样的原因这样做,确定连接哪些服务器。
对我来说,我的"lib"
目录中有一个名为"constants.rb"
的rb文件。此文件有一些if语句根据环境(开发,测试,登台或生产)进行切换,这些语句切换出我需要附加到的ip地址的值。对于我在运行应用程序的机器庞然大物上的目的而言,它足够强大。
以下是一个示例:
if ENV['RAILS_ENV'] != "production" ## if the rails environment is development or staging then use the test server
@@IP_ADDRESS = "10.16.121.173" ## the test server
else ## if the Rails environment is production, then use the live server.
@@IP_ADDRESS = "10.16.8.44" ## The is the shared IP address
end
答案 1 :(得分:0)
使用rake任务生成这些javascript文件确实是一种选择。我正在使用rake任务从YAML格式的翻译文件生成JS前端的i18n翻译文件。一种选择是将ERB用于模板。我将rakefile放在lib/tasks/foo.rake
下,将模板放在lib/tasks/foo/foo.erb
下。如果你的JS模板不是很复杂,我建议使用普通的Hash.to_json
方法来生成javascript内容:
namespace :js do
task :generate_config => :environment do
File.open("#{RAILS_ROOT}/public/javascripts/configuration.js", 'w') do |out|
config = {:option_1 => 'Value 1', :option_2 => 'Value 2'}
out << "var CONFIG = #{config.to_json}"
end
end
end
但是配置文件是您不希望在更改配置源数据时忘记重新生成的内容。我正在使用一种解决方案在生产环境中生成“缩小的”JS文件,以便将大量的javascript文件附加在一起,这样我就可以节省HTTP请求。但是你可以使用基本相同的解决方案。如果您使用Capistrano部署您的应用程序,它会很有用。
在文件app/helpers/application_helper.rb
中创建全局可用的新助手方法:
module ApplicationHelper
def javascript_include_config_tag
if ActionController::Base.perform_caching
unless File.exists?("#{RAILS_ROOT}/public/javascripts/configuration.js")
#
# TODO: Generate configuration data in here
#
config = 'configuration file contents'
File.open("#{RAILS_ROOT}/public/javascripts/configuration.js", 'w') do |out|
out << config
end
end
javascript_include_tag('configuration')
else
# Link to js generated dynamically on each request. Useful in development.
javascript_include_tag('PATH_TO_DYNAMICALLY_GENERATED_JS')
end
end
end
在您看来,您只需使用
添加javascript即可<%= javascript_include_config_tag %>
这里的想法是,在新的Capistrano部署之后,首次在页面加载时生成此JS配置文件。它还有一个巨大的缺点,你不能在第一页生成之前请求configuration.js
文件,但在我的应用程序中,它到目前为止工作正常。