使用Rails的template避免重复劳动

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

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'

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注