我的目标是在ERB模板的驱动下,在我的Rails(3)应用程序中生成静态html,javascript和图像文件的目录。例如,作为开发人员,我可能想要生成/更新这些文件:
#{Rails.root}/public/products/baseball.html
#{Rails.root}/public/products/football.js
..来自以下模板文件:
#{Rails.root}/product_templates/baseball.html.erb
#{Rails.root}/product_templates/football.js.erb
理想情况下,模板可以访问我的应用程序的Rails环境(包括URL帮助程序,查看助手,部分等)。
实现这一目标的最新和最好的方法是什么?
我尝试使用自定义Rails生成器,但发现我需要编写自定义逻辑来跳过非ERB文件,替换文件名等。必须有更好的方法。
答案 0 :(得分:1)
我不确定你要做什么,这可能有助于提供更好的答案,但这里有一些有用的信息:
你可以直接打电话给erb,这里的一些信息就在这里,可能已经在做了:
http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html
对于模板文件列表,一个简单的Dir.glob应该能够帮助您轻松找到特定文件并循环遍历它们:
http://ruby-doc.org/core/classes/Dir.html#M000629
我不知道如何建议你的棘手部分是访问帮助程序和Rails提供的其他东西。你编写的助手只是模块,所以你可以将它们混合在一起,内置的rails助手可能会有类似的东西。
这很有趣且相关,但并没有直接回答你的问题,因为它使用Liquid模板引擎而不是ERB,但除此之外,它会执行你正在讨论的一些静态网站生成:
答案 1 :(得分:0)
您是否查看了Rails模板?
例如http://m.onkey.org/rails-templates ..
不确定你到底得到了什么......你是否试图通过提供一些参数来生成客户端网站..最终目标是什么?
答案 2 :(得分:0)
这就是我完成类似工作的方式。它接受源目标和目标目录,清除目标,然后处理源目录,ERB处理文件并将它们放在目标中或简单地复制它们(在on-ERB文件的情况下)。需要修改它以处理递归处理目录。
我从rake任务中调用它:
DirectoryGenerator.new.generate(Rails.root.join('src'), Rails.root.join('public', 'dest'))
class DirectoryGenerator
include Rails.application.routes.url_helpers
include ActionView::Helpers::TagHelper
default_url_options[:host] = 'www.example.com'
def generate(source, destination)
FileUtils.rmtree(destination)
FileUtils.mkdir_p(destination)
Dir.glob(File.join(source, '*')).each do |path|
pathname = Pathname.new(path)
if pathname.extname == '.erb'
File.open(destination.join(pathname.basename.sub(/\.erb$/, '')), 'w') do |file|
file.puts(ERB.new(File.read(path)).result(binding))
end
else
FileUtils.cp(pathname, File.join(destination, pathname.basename))
end
end
end
end