ruby : 将参数传递给 ERB 模板文件追加到另一个文件

ruby : Passing argument to ERB templated file appened to an other file

我需要将一些为给定 class_name 生成的行附加到现有的咖啡脚本。我正在使用 ERB 来模板化文件 (assets/javascripts/routes.js.coffee.erb),然后附加到我的文件;但我找不到将参数传递给模板的解决方案。所以我仍然遇到 class_name 未初始化的错误。有什么想法吗?

我的生成器中有这些行

# my controller
if File.readlines(tmp_file).grep(/#{class_name.tableize}/).size <= 0 then
  open(tmp_file, 'a') { |f|
    f.puts ERB.new(File.read("#{files_origin}/assets/javascripts/routes.js.coffee.erb")).result
  }

还有我的模板文件:

# assets/javascripts/routes.js.coffee.erb
# <%= class_name.tableize %>
$stateProvider.state('<%= class_name.tableize %>', { 
  # state for showing all <%= class_name.tableize %>
  url: '/<%= class_name.tableize %>',
  templateUrl: '<%= class_name.tableize %>/index.html',
  controller: '<%= class_name.camelize(:upper) %>ListCtrl'
}).state('view<%= class_name.camelize(:upper) %>', { 
  #state for showing single <%= class_name.camelize(:upper) %>
  url: '/<%= class_name.tableize %>/:id/view',
  templateUrl: '<%= class_name.tableize %>/show.html',
  controller: '<%= class_name.camelize(:upper) %>ViewCtrl'
})

好的,我找到了:p

唯一的事情是添加 binding 选项以允许 ERB 使用我现有的 class_name 变量。

 # my controller
if File.readlines(tmp_file).grep(/#{class_name.tableize}/).size <= 0 then
  open(tmp_file, 'a') { |f|
    f.puts ERB.new(File.read("#{files_origin}/assets/javascripts/routes.js.coffee.erb")).result(binding)
  }

它现在将解释后的代码附加到我的文件中。例如,当我调用我的生成器创建 livres 时,它附加了这个:

# app/assets/javascripts/routes.js.coffee
# livres
$stateProvider.state('livres', { 
  # state for showing all livres
  url: '/livres',
  templateUrl: 'livres/index.html',
  controller: 'LivreListCtrl'
}).state('viewLivre', { 
  #state for showing single Livre
  url: '/livres/:id/view',
  templateUrl: 'livres/show.html',
  controller: 'LivreViewCtrl'
})