aboutsummaryrefslogtreecommitdiffstats
path: root/guides/source/rails_application_templates.md
diff options
context:
space:
mode:
authorXavier Noria <fxn@hashref.com>2012-09-17 13:59:45 -0700
committerXavier Noria <fxn@hashref.com>2012-09-17 13:59:45 -0700
commit5f34f12977852ada2186ea451663e98b0f9a8d28 (patch)
tree35b41a14bcc2d59643d86dcd2e4049e1c225a6bb /guides/source/rails_application_templates.md
parenta95ddf647580a8cb9347e557b4468c55d81fd026 (diff)
parent1fa5c3b39f5d0bb23c8c3d60b023613386629946 (diff)
downloadrails-5f34f12977852ada2186ea451663e98b0f9a8d28.tar.gz
rails-5f34f12977852ada2186ea451663e98b0f9a8d28.tar.bz2
rails-5f34f12977852ada2186ea451663e98b0f9a8d28.zip
Merge pull request #7663 from sikachu/master-guide-markdown
Convert all the guides into GFM
Diffstat (limited to 'guides/source/rails_application_templates.md')
-rw-r--r--guides/source/rails_application_templates.md218
1 files changed, 218 insertions, 0 deletions
diff --git a/guides/source/rails_application_templates.md b/guides/source/rails_application_templates.md
new file mode 100644
index 0000000000..ee5fbcfd52
--- /dev/null
+++ b/guides/source/rails_application_templates.md
@@ -0,0 +1,218 @@
+Rails Application Templates
+===========================
+
+Application templates are simple Ruby files containing DSL for adding gems/initializers etc. to your freshly created Rails project or an existing Rails project.
+
+By referring to this guide, you will be able to:
+
+* Use templates to generate/customize Rails applications
+* Write your own reusable application templates using the Rails template API
+
+--------------------------------------------------------------------------------
+
+Usage
+-----
+
+To apply a template, you need to provide the Rails generator with the location of the template you wish to apply, using -m option. This can either be path to a file or a URL.
+
+```bash
+$ rails new blog -m ~/template.rb
+$ rails new blog -m http://example.com/template.rb
+```
+
+You can use the rake task `rails:template` to apply templates to an existing Rails application. The location of the template needs to be passed in to an environment variable named LOCATION. Again, this can either be path to a file or a URL.
+
+```bash
+$ rake rails:template LOCATION=~/template.rb
+$ rake rails:template LOCATION=http://example.com/template.rb
+```
+
+Template API
+------------
+
+Rails templates API is very self explanatory and easy to understand. Here's an example of a typical Rails template:
+
+```ruby
+# template.rb
+run "rm public/index.html"
+generate(:scaffold, "person name:string")
+route "root :to => 'people#index'"
+rake("db:migrate")
+
+git :init
+git :add => "."
+git :commit => %Q{ -m 'Initial commit' }
+```
+
+The following sections outlines the primary methods provided by the API:
+
+### gem(name, options = {})
+
+Adds a `gem` entry for the supplied gem to the generated application’s `Gemfile`.
+
+For example, if your application depends on the gems `bj` and `nokogiri`:
+
+```ruby
+gem "bj"
+gem "nokogiri"
+```
+
+Please note that this will NOT install the gems for you and you will have to run `bundle install` to do that.
+
+```bash
+bundle install
+```
+
+### gem_group(*names, &block)
+
+Wraps gem entries inside a group.
+
+For example, if you want to load `rspec-rails` only in `development` and `test` group:
+
+```ruby
+gem_group :development, :test do
+ gem "rspec-rails"
+end
+```
+
+### add_source(source, options = {})
+
+Adds the given source to the generated application's `Gemfile`.
+
+For example, if you need to source a gem from "http://code.whytheluckystiff.net":
+
+```ruby
+add_source "http://code.whytheluckystiff.net"
+```
+
+### vendor/lib/file/initializer(filename, data = nil, &block)
+
+Adds an initializer to the generated application’s `config/initializers` directory.
+
+Lets say you like using `Object#not_nil?` and `Object#not_blank?`:
+
+```ruby
+initializer 'bloatlol.rb', <<-CODE
+ class Object
+ def not_nil?
+ !nil?
+ end
+
+ def not_blank?
+ !blank?
+ end
+ end
+CODE
+```
+
+Similarly `lib()` creates a file in the `lib/` directory and `vendor()` creates a file in the `vendor/` directory.
+
+There is even `file()`, which accepts a relative path from `Rails.root` and creates all the directories/file needed:
+
+```ruby
+file 'app/components/foo.rb', <<-CODE
+ class Foo
+ end
+CODE
+```
+
+That’ll create `app/components` directory and put `foo.rb` in there.
+
+### rakefile(filename, data = nil, &block)
+
+Creates a new rake file under `lib/tasks` with the supplied tasks:
+
+```ruby
+rakefile("bootstrap.rake") do
+ <<-TASK
+ namespace :boot do
+ task :strap do
+ puts "i like boots!"
+ end
+ end
+ TASK
+end
+```
+
+The above creates `lib/tasks/bootstrap.rake` with a `boot:strap` rake task.
+
+### generate(what, args)
+
+Runs the supplied rails generator with given arguments.
+
+```ruby
+generate(:scaffold, "person", "name:string", "address:text", "age:number")
+```
+
+### run(command)
+
+Executes an arbitrary command. Just like the backticks. Let's say you want to remove the `public/index.html` file:
+
+```ruby
+run "rm public/index.html"
+```
+
+### rake(command, options = {})
+
+Runs the supplied rake tasks in the Rails application. Let's say you want to migrate the database:
+
+```ruby
+rake "db:migrate"
+```
+
+You can also run rake tasks with a different Rails environment:
+
+```ruby
+rake "db:migrate", :env => 'production'
+```
+
+### route(routing_code)
+
+This adds a routing entry to the `config/routes.rb` file. In above steps, we generated a person scaffold and also removed `public/index.html`. Now to make `PeopleController#index` as the default page for the application:
+
+```ruby
+route "root :to => 'person#index'"
+```
+
+### inside(dir)
+
+Enables you to run a command from the given directory. For example, if you have a copy of edge rails that you wish to symlink from your new apps, you can do this:
+
+```ruby
+inside('vendor') do
+ run "ln -s ~/commit-rails/rails rails"
+end
+```
+
+### ask(question)
+
+`ask()` gives you a chance to get some feedback from the user and use it in your templates. Lets say you want your user to name the new shiny library you’re adding:
+
+```ruby
+lib_name = ask("What do you want to call the shiny library ?")
+lib_name << ".rb" unless lib_name.index(".rb")
+
+lib lib_name, <<-CODE
+ class Shiny
+ end
+CODE
+```
+
+### yes?(question) or no?(question)
+
+These methods let you ask questions from templates and decide the flow based on the user’s answer. Lets say you want to freeze rails only if the user want to:
+
+```ruby
+rake("rails:freeze:gems") if yes?("Freeze rails gems ?")
+# no?(question) acts just the opposite.
+```
+
+### git(:command)
+
+Rails templates let you run any git command:
+
+```ruby
+git :init
+git :add => "."
+git :commit => "-a -m 'Initial commit'"
+```