2011-02-22 20 views
1

我的目標是在我的Rails(3)應用程序中生成一個由ERB模板驅動的靜態html,javascript和圖像文件的目錄。例如,作爲一個開發者,我可能要生成/更新這些文件:使用Rails和ERB從模板文件目錄生成文件目錄的最合適的方法是什麼?

#{Rails.root}/public/products/baseball.html 
#{Rails.root}/public/products/football.js 

..from以下模板文件:

#{Rails.root}/product_templates/baseball.html.erb 
#{Rails.root}/product_templates/football.js.erb 

理想的模板將有機會獲得我的應用程序的Rails環境(包括URL助手,視圖助手,部分等)。

完成此操作的最新最好方法是什麼?

我嘗試使用自定義Rails生成器,但發現我需要編寫用於跳過非ERB文件,替換文件名等的自定義邏輯。必須有更好的方法。

+0

會在哪裏這些模板文件中的數據從何而來?這是一套數據,還是很多模板?如果沒有,數據如何分離,並與模板匹配,或者您如何考慮這樣做? – ctcherry

+0

模板文件將在開發時進行編輯,然後進行處理,輸出的結果將進入目標目錄。在這種情況下,我生成的文件最終將打包成瀏覽器擴展。我認爲生成API文檔(可能會改變,但不需要動態)將是另一個例子。 –

回答

0

這就是我如何完成類似的事情。它接受源目錄和目標目錄,清除目標,然後處理源目錄,ERB處理文件並將它們放在目標中,或者簡單地複製它們(對於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 
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幫助程序類似。


這是有趣和相關但不直接回答你的問題,因爲它使用了液體模板引擎,而不是僱員再培訓局,但在其他方面,它做了一些你所談論的靜態站點生成:

https://github.com/mojombo/jekyll

相關問題