Ruby on rails 什么';为Rails项目生成特定于环境的文件的最佳方法是什么?

Ruby on rails 什么';为Rails项目生成特定于环境的文件的最佳方法是什么?,ruby-on-rails,ruby,templates,caching,Ruby On Rails,Ruby,Templates,Caching,我在Javascript文件中有一些需要的设置——要连接的服务器——这些设置会根据我的环境而变化。对于开发、测试和登台,我想使用登台服务器;对于生产,生产服务器。我已经有Ruby中的设置(在我的环境/xyz.rb文件中配置)。到目前为止,我一直在请求时使用application.JS.erb文件和自定义路由动态创建JS文件。但这相当慢,这意味着只为该文件创建一个额外的控制器和视图目录 我更希望有一个模板文件和一个rake任务,它从模板生成正确的版本,并将一个静态文件放在public/javasc

我在Javascript文件中有一些需要的设置——要连接的服务器——这些设置会根据我的环境而变化。对于
开发
测试
登台
,我想使用登台服务器;对于
生产
,生产服务器。我已经有Ruby中的设置(在我的
环境/xyz.rb
文件中配置)。到目前为止,我一直在请求时使用
application.JS.erb
文件和自定义路由动态创建JS文件。但这相当慢,这意味着只为该文件创建一个额外的控制器和视图目录

我更希望有一个模板文件和一个rake任务,它从模板生成正确的版本,并将一个静态文件放在
public/javascripts
目录中。有人试过这样的东西吗?渲染时使用了什么?你把模板文件和渲染代码放在哪里了


还是只保留动态版本并将其缓存到生产环境中更好?

您可以这样做吗

<% javascript_include_file "#{RAILS_ENV}.js" %>

使用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
在您看来,您只需将javascript与

<%= javascript_include_config_tag %>


这里的想法是,这个JS配置文件仅在重新部署Capistrano后的页面加载时第一次生成。它还有一个巨大的缺点,就是你不能在生成第一页之前请求
configuration.js
文件,但在我的应用程序中,它目前运行良好。

这是一个好主意。可能不会有数百个甚至几十个环境,因此不会有成吨的文件。我可能建议使用信息量稍大一些的名称,如“settings_35;{RAILS_ENV.downcase}.js”或“constants_35;…”文件名信息量越大越好。很高兴你喜欢这个主意。
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_include_config_tag %>