1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/guides/source/rails_application_templates.textile

216 lines
5.3 KiB
Text
Raw Normal View History

2009-04-17 09:28:46 -04:00
h2. Rails Application Templates
2012-01-02 15:49:18 -05:00
Application templates are simple Ruby files containing DSL for adding gems/initializers etc. to your freshly created Rails project or an existing Rails project.
2009-07-25 11:03:58 -04:00
By referring to this guide, you will be able to:
2009-04-17 09:28:46 -04:00
2009-07-25 11:03:58 -04:00
* Use templates to generate/customize Rails applications
* Write your own reusable application templates using the Rails template API
2009-04-17 09:28:46 -04:00
endprologue.
2009-07-25 11:03:58 -04:00
h3. Usage
2009-04-17 09:28:46 -04:00
2011-07-22 16:51:05 -04:00
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.
2009-07-25 11:03:58 -04:00
<shell>
$ rails new blog -m ~/template.rb
2011-07-22 16:51:05 -04:00
$ rails new blog -m http://example.com/template.rb
2009-07-25 11:03:58 -04:00
</shell>
2011-07-22 16:51:05 -04:00
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.
2009-07-25 11:03:58 -04:00
<shell>
$ rake rails:template LOCATION=~/template.rb
2011-07-22 16:51:05 -04:00
$ rake rails:template LOCATION=http://example.com/template.rb
2009-07-25 11:03:58 -04:00
</shell>
h3. Template API
2011-04-13 20:58:26 -04:00
Rails templates API is very self explanatory and easy to understand. Here's an example of a typical Rails template:
2009-07-25 11:03:58 -04:00
<ruby>
# template.rb
run "rm public/index.html"
generate(:scaffold, "person name:string")
2010-12-26 11:40:56 -05:00
route "root :to => 'people#index'"
2009-07-25 11:03:58 -04:00
rake("db:migrate")
git :init
git :add => "."
git :commit => "-a -m 'Initial commit'"
</ruby>
2011-04-13 20:58:26 -04:00
The following sections outlines the primary methods provided by the API:
2009-07-25 11:03:58 -04:00
h4. gem(name, options = {})
2010-12-26 11:40:56 -05:00
Adds a +gem+ entry for the supplied gem to the generated applications +Gemfile+.
2009-07-25 11:03:58 -04:00
2011-04-13 20:58:26 -04:00
For example, if your application depends on the gems +bj+ and +nokogiri+:
2009-07-25 11:03:58 -04:00
<ruby>
gem "bj"
gem "nokogiri"
2009-07-25 11:03:58 -04:00
</ruby>
2011-06-11 12:01:45 -04:00
Please note that this will NOT install the gems for you and you will have to run +bundle install+ to do that.
2009-07-25 11:03:58 -04:00
<ruby>
2011-06-11 12:01:45 -04:00
bundle install
2009-07-25 11:03:58 -04:00
</ruby>
2011-09-04 04:14:53 -04:00
h4. 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
</ruby>
2010-12-26 12:30:03 -05:00
h4. 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"
</ruby>
2009-07-25 11:03:58 -04:00
h4. vendor/lib/file/initializer(filename, data = nil, &block)
Adds an initializer to the generated applications +config/initializers+ directory.
2011-04-13 20:58:26 -04:00
Lets say you like using +Object#not_nil?+ and +Object#not_blank?+:
2009-07-25 11:03:58 -04:00
<ruby>
initializer 'bloatlol.rb', <<-CODE
class Object
def not_nil?
!nil?
end
2009-07-25 11:03:58 -04:00
def not_blank?
!blank?
end
end
CODE
</ruby>
Similarly +lib()+ creates a file in the +lib/+ directory and +vendor()+ creates a file in the +vendor/+ directory.
2011-04-13 20:58:26 -04:00
There is even +file()+, which accepts a relative path from +Rails.root+ and creates all the directories/file needed:
2009-07-25 11:03:58 -04:00
<ruby>
file 'app/components/foo.rb', <<-CODE
class Foo
end
CODE
</ruby>
Thatll create +app/components+ directory and put +foo.rb+ in there.
h4. rakefile(filename, data = nil, &block)
2011-04-13 20:58:26 -04:00
Creates a new rake file under +lib/tasks+ with the supplied tasks:
2009-07-25 11:03:58 -04:00
<ruby>
rakefile("bootstrap.rake") do
<<-TASK
namespace :boot do
task :strap do
puts "i like boots!"
end
end
TASK
end
</ruby>
The above creates +lib/tasks/bootstrap.rake+ with a +boot:strap+ rake task.
h4. generate(what, args)
2011-08-15 11:06:32 -04:00
Runs the supplied rails generator with given arguments.
2009-07-25 11:03:58 -04:00
<ruby>
generate(:scaffold, "person", "name:string", "address:text", "age:number")
</ruby>
h4. run(command)
2011-04-13 20:58:26 -04:00
Executes an arbitrary command. Just like the backticks. Let's say you want to remove the +public/index.html+ file:
2009-07-25 11:03:58 -04:00
<ruby>
run "rm public/index.html"
</ruby>
h4. rake(command, options = {})
2011-04-13 20:58:26 -04:00
Runs the supplied rake tasks in the Rails application. Let's say you want to migrate the database:
2009-07-25 11:03:58 -04:00
<ruby>
rake "db:migrate"
</ruby>
2011-04-13 20:58:26 -04:00
You can also run rake tasks with a different Rails environment:
2009-07-25 11:03:58 -04:00
<ruby>
rake "db:migrate", :env => 'production'
</ruby>
h4. route(routing_code)
2011-04-13 20:58:26 -04:00
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:
2009-07-25 11:03:58 -04:00
<ruby>
2010-12-26 11:40:56 -05:00
route "root :to => 'person#index'"
2009-07-25 11:03:58 -04:00
</ruby>
h4. inside(dir)
2011-02-20 11:01:12 -05:00
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:
2009-07-25 11:03:58 -04:00
<ruby>
inside('vendor') do
run "ln -s ~/commit-rails/rails rails"
end
</ruby>
h4. ask(question)
2011-04-13 20:58:26 -04:00
+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 youre adding:
2009-07-25 11:03:58 -04:00
<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
</ruby>
h4. yes?(question) or no?(question)
2011-04-13 20:58:26 -04:00
These methods let you ask questions from templates and decide the flow based on the users answer. Lets say you want to freeze rails only if the user want to:
2009-07-25 11:03:58 -04:00
<ruby>
rake("rails:freeze:gems") if yes?("Freeze rails gems ?")
no?(question) acts just the opposite.
</ruby>
2011-06-11 12:01:45 -04:00
h4. git(:command)
2009-07-25 11:03:58 -04:00
2011-04-13 20:58:26 -04:00
Rails templates let you run any git command:
2009-07-25 11:03:58 -04:00
<ruby>
git :init
git :add => "."
git :commit => "-a -m 'Initial commit'"
</ruby>