From 385dba551e6bec3c419b975bb7eeb59a4d78ec6a Mon Sep 17 00:00:00 2001 From: "Carlos A. da Silva" Date: Fri, 23 Oct 2009 10:13:23 -0200 Subject: [PATCH] Adding simple devise generator to create a model, migration and route. --- CHANGELOG.rdoc | 15 +++++------ README.rdoc | 2 +- generators/devise/USAGE | 1 + generators/devise/devise_generator.rb | 25 ++++++++++++++++++ generators/devise/lib/route_devise.rb | 32 ++++++++++++++++++++++++ generators/devise/templates/README | 21 ++++++++++++++++ generators/devise/templates/migration.rb | 20 +++++++++++++++ generators/devise/templates/model.rb | 5 ++++ lib/devise.rb | 7 +++--- 9 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 generators/devise/USAGE create mode 100644 generators/devise/devise_generator.rb create mode 100644 generators/devise/lib/route_devise.rb create mode 100644 generators/devise/templates/README create mode 100644 generators/devise/templates/migration.rb create mode 100644 generators/devise/templates/model.rb diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc index 36fda18d..98aabb3d 100644 --- a/CHANGELOG.rdoc +++ b/CHANGELOG.rdoc @@ -1,20 +1,21 @@ == 0.1.2 (development) -* bug fixes - * Fixed requiring devise strategies +* enhancements + * [#4] Allow option :null => true in authenticable migration + * [#3] Remove attr_accessible calls from devise modules + * Customizable time frame for rememberable with :remember_for config + * Customizable time frame for confirmable with :confirm_in config * optimize * Do not load hooks or strategies if they are not used -* enhancements - * Allow option :null => true in authenticable migration - * Customizable time frame for rememberable with :remember_for config - * Customizable time frame for confirmable with :confirm_in config +* bug fixes + * [#2] Fixed requiring devise strategies == 0.1.1 * bug fixes - * Fixed requiring devise mapping + * [#1] Fixed requiring devise mapping == 0.1.0 diff --git a/README.rdoc b/README.rdoc index 087cf78d..b6ccee29 100644 --- a/README.rdoc +++ b/README.rdoc @@ -168,7 +168,7 @@ After signing in a user, confirming it's account or updating it's password, devi You also need to setup default url options for the mailer, if you are using confirmable or recoverable. It's a Rails required configuration, and you can do this inside your specific environments. Here is an example of development environment: - config.action_mailer.default_url_options = {:host => 'localhost:3000'} + config.action_mailer.default_url_options = { :host => 'localhost:3000' } Devise let's you setup as many roles as you want, so let's say you already have this User model and also want an Admin model with the same authentication stuff, but not confirmation or password recovery. Just follow the same steps: diff --git a/generators/devise/USAGE b/generators/devise/USAGE new file mode 100644 index 00000000..ccef8db6 --- /dev/null +++ b/generators/devise/USAGE @@ -0,0 +1 @@ +script/generate devise User diff --git a/generators/devise/devise_generator.rb b/generators/devise/devise_generator.rb new file mode 100644 index 00000000..b0f567c3 --- /dev/null +++ b/generators/devise/devise_generator.rb @@ -0,0 +1,25 @@ +require File.expand_path(File.dirname(__FILE__) + "/lib/route_devise.rb") + +class DeviseGenerator < Rails::Generator::NamedBase + + def manifest + record do |m| + # Check for class naming collisions. + m.class_collisions(class_name) + + # Model + m.directory(File.join('app', 'models', class_path)) + m.template 'model.rb', File.join('app', 'models', "#{file_path}.rb") + + # Migration + m.migration_template 'migration.rb', 'db/migrate', :migration_file_name => "devise_create_#{table_name}" + + # Routing + m.route_devise table_name + + # Readme + m.readme "README" + end + end + +end diff --git a/generators/devise/lib/route_devise.rb b/generators/devise/lib/route_devise.rb new file mode 100644 index 00000000..be4add3a --- /dev/null +++ b/generators/devise/lib/route_devise.rb @@ -0,0 +1,32 @@ +module Rails + module Generator + module Commands + class Create < Base + + # Create devise route. Based on route_resources + def route_devise(*resources) + resource_list = resources.map { |r| r.to_sym.inspect }.join(', ') + sentinel = 'ActionController::Routing::Routes.draw do |map|' + + logger.route "map.devise_for #{resource_list}" + unless options[:pretend] + gsub_file 'config/routes.rb', /(#{Regexp.escape(sentinel)})/mi do |match| + "#{match}\n map.devise_for #{resource_list}\n" + end + end + end + end + + class Destroy < RewindBase + + # Destroy devise route. Based on route_resources + def route_devise(*resources) + resource_list = resources.map { |r| r.to_sym.inspect }.join(', ') + look_for = "\n map.devise_for #{resource_list}\n" + logger.route "map.devise_for #{resource_list}" + gsub_file 'config/routes.rb', /(#{look_for})/mi, '' + end + end + end + end +end diff --git a/generators/devise/templates/README b/generators/devise/templates/README new file mode 100644 index 00000000..bb46514d --- /dev/null +++ b/generators/devise/templates/README @@ -0,0 +1,21 @@ + +================================================================================ + +Some setup you must do manually if you haven't yet: + +1. Setup defaut url options for your specific environment. Here is an example of development environment: + + config.action_mailer.default_url_options = { :host => 'localhost:3000' } + +It's a Rails required configuration. +In production it must be the actual host your application is deployed to. + +2. Setup default sender for mails.In config/environment.rb: + + Notifier.sender = "test@example.com" + +3. Ensure you have defined root_url to *something* in your config/routes.rb: + + map.root :controller => 'home' + +================================================================================ diff --git a/generators/devise/templates/migration.rb b/generators/devise/templates/migration.rb new file mode 100644 index 00000000..0e744f6e --- /dev/null +++ b/generators/devise/templates/migration.rb @@ -0,0 +1,20 @@ +class DeviseCreate<%= table_name.camelize %> < ActiveRecord::Migration + def self.up + create_table(:<%= table_name %>) do |t| + t.authenticable + t.confirmable + t.recoverable + t.rememberable + + t.timestamps + end + + add_index :<%= table_name %>, :email, :unique => true + add_index :<%= table_name %>, :confirmation_token, :unique => true + add_index :<%= table_name %>, :reset_password_token, :unique => true + end + + def self.down + drop_table :<%= table_name %> + end +end diff --git a/generators/devise/templates/model.rb b/generators/devise/templates/model.rb new file mode 100644 index 00000000..9a2f6887 --- /dev/null +++ b/generators/devise/templates/model.rb @@ -0,0 +1,5 @@ +class <%= class_name %> < ActiveRecord::Base + devise :all + # Setup accessible (or protected) attributes for your model + attr_accessible :email, :password, :password_confirmation +end diff --git a/lib/devise.rb b/lib/devise.rb index 5ab2fcfa..33474143 100644 --- a/lib/devise.rb +++ b/lib/devise.rb @@ -56,9 +56,10 @@ end # # 1) Include Devise::ActiveRecord and Devise::Migrations # 2) Load and config warden -# 3) Add routes extensions -# 4) Load routes definitions -# 5) Include filters and helpers in controllers and views +# 3) Load devise mapping structure +# 4) Add routes extensions +# 5) Load routes definitions +# 6) Include filters and helpers in controllers and views # Rails.configuration.after_initialize do ActiveRecord::Base.extend Devise::ActiveRecord