使用Rails和ERB从模板文件目录生成文件目录的最合适方法?

时间:2011-02-22 05:21:11

标签: ruby-on-rails ruby ruby-on-rails-3 erb

我的目标是在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文件,替换文件名等。必须有更好的方法。

3 个答案:

答案 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,但除此之外,它会执行你正在讨论的一些静态网站生成:

https://github.com/mojombo/jekyll

答案 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