Ruby on rails 什么';为Rails项目生成特定于环境的文件的最佳方法是什么?
我在Javascript文件中有一些需要的设置——要连接的服务器——这些设置会根据我的环境而变化。对于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
开发
、测试
和登台
,我想使用登台服务器;对于生产
,生产服务器。我已经有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 %>