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'
})
我需要将一些为给定 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'
})