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

时间:2008-12-29 19:03:28

标签: ruby-on-rails ruby templates caching

我在Javascript文件中需要一些设置 - 连接到的服务器 - 根据我的环境进行更改。对于developmentteststaging,我想使用登台服务器;对于production,生产服务器。我已经拥有Ruby中的设置(在我的environment/xyz.rb文件中配置)。到目前为止,我一直在请求时使用application.js.erb文件和自定义路由动态创建JS文件。但这很慢,这意味着只为这个文件创建一个额外的控制器和视图目录。

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

或者保持动态版本并将其缓存在生产中是否更好?

2 个答案:

答案 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文件,但在我的应用程序中,它到目前为止工作正常。

相关问题