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

时间:2015-04-19 22:58:51

标签: ruby-on-rails erb

我需要为现有的咖啡脚本附加为给定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'
})

1 个答案:

答案 0 :(得分:0)

好的,我已经找到了: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'
})