说起来这个template功能在 Rails 2 时代就已经存在了。所以这并不算什么新鲜玩意。可惜我当时没关注,后来更是忘得精光。今天看了一篇别人的博客才发现这就是我一直想找的东西。
你是否觉得初始化每个Rails项目时都要做一些重复的工作?比如在Gemfile中加入常用的gem,用jQuery替换Prototype,跑一些generator……等等。Rails template 可以让你用代码完成这些重复工作。
说明:本人开发环境是Rails 3.0.4,所以以下的命令都是Rails 3的。
比如你把自己要做的事情用DSL写在一个文件里(内容随便写的):
# File path # ~/rails_template.rb gem 'jquery-rails' gem 'rspec', :group => :test run "bundle install" generate :scaffold, "User name:string" rake "db:migrate"
代码意图很清晰,不会有哪个搞Rails的看不懂吧……
然后在新建一个项目(就叫your_app吧)时,用 -m 参数引用这个文件路径:
rails new your_app -JT -m ~/rails_template.rb
Rails在初始化项目完成后,就会执行脚本中的内容。是不是很酷呢?
其实Rails template只是提供一套平易近人的API来让你描述一些日常工作。而且它并不仅仅只能在项目初始化的时候使用,也可以对一个已经存在的Rails项目使用。你只需要执行rails:template任务并把文件路径传给LOCATION参数即可:
rake rails:template LOCATION=~/rails_template.rb
这样一来你完全可以把日常任务放到各种不同的Rails template里面,根据不同的情况使用。或者给一个Rails项目应用多个不同的template。Don't Repeat Yourself !
按照俺的习惯,本文同样只是介绍这么个玩意给没用过的developers。毕竟我也是在学习,而且没必要重复别人的东西,不是么?(尤其是当别人已经写的很好时)。 如果想看更详细的东西,你可以在下面两篇文章中找到答案(推荐先看第一篇):
我的Rails 3 App Template (+jQuery + RSpec + Watchr)
这篇文章可以算是Rails template的“最佳实践”了,里面目录结构的设计值得学习。而且从template文件中你可以找到大部分你想要的API,比如替换config/application.rb配置文件中的某一行,把新的配置增量写入一个文件……而且这些API在Rails API中还查不到……如果谁找到了,可以告诉我一声。
Rails template提供的一些API的介绍,比 Rails API 上的要详细一点点。
最后贴一份我自己的Rails template,仿造第一篇文章写的。我用它来初始化一些测试项目:
这是Rails template
# File path: # ~/shared_scripts/rails_template/rails3.rb # # How to use: # rails new your_app -TJ -m ~/shared_scripts/rails_template/rails3.rb # Use customized Gemfile instead of the auto-generated Gemfile # Customized Gemfile is in ~/shared_scripts/rails_template/ run "mv Gemfile Gemfile.old" file 'Gemfile', File.read("#{File.dirname(rails_template)}/Gemfile") run "bundle install" generate 'rspec:install' generate 'jquery:install' # For coffee script generate 'barista:install' # Create dir for coffee script and sass run "mkdir app/coffeescripts" run "mkdir public/stylesheets/sass" # Setting jquery gsub_file 'config/application.rb', /(config.action_view.javascript_expansions.*)/, "config.action_view.javascript_expansions[:defaults] = %w(jquery rails)" # Keep tmp and log directory run "touch tmp/.gitkeep" run "touch log/.gitkeep" # Create scaffold if needed if yes?("Do you want to generate a scaffold ?") params = ask("Enter scaffold: ") generate :scaffold, params rake "db:migrate" end
这是Gemfile
# File path: # ~/shared_scripts/rails_template/Gemfile source 'http://rubygems.org' gem 'rails', '3.0.4' # Bundle edge Rails instead: # gem 'rails', :git => 'git://github.com/rails/rails.git' gem 'sqlite3' # PostgreSQL adapter # gem 'pg' gem 'jquery-rails' gem 'haml' gem 'haml-rails' gem 'json' gem 'barista' # Must apply rspec in development env, or the generators will generate test_unit files instead of rspec ones group :development, :test do gem 'rspec' gem 'rspec-rails' end # AR finder # gem 'meta_where' # Paginator # gem 'kaminari' # HTML5 offline app # gem 'rack-offline'