使用 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 %>
这里的想法是,这个 JS 配置文件仅在新 Capistrano 部署后第一次页面加载时生成。它还有一个巨大的缺点,即您无法在生成第一页之前请求 configuration.js 文件,但在我的应用程序中,到目前为止它运行良好。