Posts Tagged with "generators"
Create your own custom rails generator
FEB
22
2009
It's really easy to add a custom generator to your Rails application. Say you have a component you want to include in multiple projects, but you don't want to manually copy ALL of the files from project to project. At Plexus, we have an empty Rails project with basic styling and structure that we use for all new applications. We have several components that we wanted to simplify adding to new projects. So, we created a few custom generators that we can use to create the components with very little effort.
The first thing you need to do is add a generators folder inside the lib folder. In there you can add the files and folders for each custom generator. In this example, I'll use a Blog as the component I'm building a generator for.
Inside the generators folder, I created a blog folder (hint: whatever you name the folder will be how you call your custom generator). All of my files for the blog functionality will be in this folder. The two most important things in this folder are the actual generator file that will do all of the work and the templates folder which contains all the files to be copied. My blog generator file, blog_generator.rb looks like this:
class BlogGenerator < Rails::Generator::Base
def manifest
record do |m|
# Controllers
m.file "controllers/blog_controller.rb", "app/controllers/blog_controller.rb"
# Models
m.file "models/blog_post.rb", "app/models/blog_post.rb"
# Helpers
m.file "helpers/blog_helper.rb", "app/helpers/blog_helper.rb"
# Views
m.directory "app/views/blog"
m.file "views/index.html.erb", "app/views/blog/index.html.erb"
m.file "views/details.html.erb", "app/views/blog/details.html.erb"
m.file "views/feed.rss.builder", "app/views/blog/feed.rss.builder"
# Migration
m.migration_template "migrate/create_blog.rb", "db/migrate"
# Tests
m.file "test/fixtures/blog_posts.yml", "test/fixtures/blog_posts.yml"
m.file "test/functional/blog_controller_test.rb", "test/functional/blog_controller_test.rb"
m.file "test/unit/blog_post_test.rb", "test/unit/blog_post_test.rb"
# CSS and images
m.file "assets/blog_styles.css", "public/stylesheets/px_blogger.css"
m.file "assets/comment_add.gif", "public/images/comment_add.gif"
m.file "assets/comment.gif", "public/images/comment.gif"
m.readme "INSTALL"
end
end
def file_name
"create_blog"
end
end
Here is a breakdown of what is going on:
- The directory method will create the specified directory if it doesn't exist already.
- The file method will copy the specified file to the given directory.
- The migration_template file will copy the given migration file into the db/migrations folder using the file_name method defined at the bottom of the generator to name the file.
- The readme function prints out the contents of the INSTALL file after the generator script is called. You can use this file to put any extra instructions for the generator.
This is what the file structure looks like for the generator:
lib
\- generators
\- blog
\- blog_generator.rb
templates
\- assets
\- blog_styles.css
comment_add.gif
comment.gif
controllers
\- blog_controller.rb
helpers
\- blog_helper.rb
INSTALL
migrate
\- create_blog.rb
models
\- blog_post.rb
test
\- fixtures
\- blog_posts.yml
functional
\- blog_controller_test.rb
unit
\- blog_post_test.rb
views
\- index.html.erb
details.html.erb
feed.rss.builder
USAGE
All we need to do to run this generator is call script/generate blog.
Tagged: rails, generators, tutorial
Popular Posts
Search
Tags
actionmailer activerecord ajax apache apple barcamp caching capistrano centos code golf css db delete eager loading ebay email attachment erb flash ftp fun generators get haml helpers ie sucks javascript jquery lightbox lost merb net ftp paperclip passenger php plexus post presentation rails rails machine railsconf redesign rest rjs routes rss ruby ruby on rails safari script sinatra symfony text replacement tips tutorial twitter xhtml
Projects
© 2010 Travis Roberts. All rights reserved.