说起来这个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'