diff --git a/lib/generators/active_record/devise_generator.rb b/lib/generators/active_record/devise_generator.rb index 0382003fbd..9d2bd742f8 100644 --- a/lib/generators/active_record/devise_generator.rb +++ b/lib/generators/active_record/devise_generator.rb @@ -1,6 +1,7 @@ require 'rails/generators/active_record' require 'generators/devise/orm_helpers' + module ActiveRecord module Generators class DeviseGenerator < ActiveRecord::Generators::Base @@ -9,14 +10,27 @@ class DeviseGenerator < ActiveRecord::Generators::Base include Devise::Generators::OrmHelpers source_root File.expand_path("../templates", __FILE__) - def generate_model - invoke "active_record:model", [name], :migration => false unless model_exists? && behavior == :invoke - end - def copy_devise_migration - migration_template "migration.rb", "db/migrate/devise_create_#{table_name}" + exists = model_exists? + unless behavior == :revoke + unless exists + migration_template "migration.rb", "db/migrate/devise_create_#{table_name}" + else + migration_template "migration_existing.rb", "db/migrate/add_devise_to_#{table_name}" + end + else + if migration_exists?(table_name) + migration_template "migration_existing.rb", "db/migrate/add_devise_to_#{table_name}" + else + migration_template "migration.rb", "db/migrate/devise_create_#{table_name}" + end + end end + def generate_model + invoke "active_record:model", [name], :migration => false unless model_exists? && behavior == :invoke + end + def inject_devise_content inject_into_class(model_path, class_name, model_contents + < < ActiveRecord::Migration + def self.up + change_table :<%= table_name %> do |t| + t.database_authenticatable :null => false + t.recoverable + t.rememberable + t.trackable + + # t.encryptable + # t.confirmable + # t.lockable :lock_strategy => :<%= Devise.lock_strategy %>, :unlock_strategy => :<%= Devise.unlock_strategy %> + # t.token_authenticatable + +<% for attribute in attributes -%> + t.<%= attribute.type %> :<%= attribute.name %> +<% end -%> + #Uncomment below if timestamps were not included in your original model. + t.timestamps + end + add_index :<%= table_name %>, :email, :unique => true + add_index :<%= table_name %>, :reset_password_token, :unique => true + # add_index :<%= table_name %>, :confirmation_token, :unique => true + # add_index :<%= table_name %>, :unlock_token, :unique => true + # add_index :<%= table_name %>, :authentication_token, :unique => true + end + + def self.down + #By default, we don't want to make any assumption about how to roll back a migration when your + #model already existed. Please edit below which fields you would like to remove in this migration. + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/lib/generators/devise/orm_helpers.rb b/lib/generators/devise/orm_helpers.rb index 99251f2868..644f83d11d 100644 --- a/lib/generators/devise/orm_helpers.rb +++ b/lib/generators/devise/orm_helpers.rb @@ -14,6 +14,14 @@ def model_contents def model_exists? File.exists?(File.join(destination_root, model_path)) end + + def migration_exists?(table_name) + Dir.glob("#{File.join(destination_root, migration_path)}/[0-9]*_*.rb").grep(/\d+_add_devise_to_#{table_name}.rb$/).first + end + + def migration_path + @migration_path ||= File.join("db", "migrate") + end def model_path @model_path ||= File.join("app", "models", "#{file_path}.rb") diff --git a/test/generators/active_record_generator_test.rb b/test/generators/active_record_generator_test.rb index 8c33994c4d..f2b466ede4 100644 --- a/test/generators/active_record_generator_test.rb +++ b/test/generators/active_record_generator_test.rb @@ -13,9 +13,22 @@ class ActiveRecordGeneratorTest < Rails::Generators::TestCase assert_file "app/models/monster.rb", /devise/, /attr_accessible (:[a-z_]+(, )?)+/ assert_migration "db/migrate/devise_create_monsters.rb" end + + test "update model migration when model exists" do + run_generator %w(monster) + assert_file "app/models/monster.rb" + run_generator %w(monster) + assert_migration "db/migrate/add_devise_to_monsters.rb" + end test "all files are properly deleted" do run_generator %w(monster) + run_generator %w(monster) + assert_migration "db/migrate/devise_create_monsters.rb" + assert_migration "db/migrate/add_devise_to_monsters.rb" + run_generator %w(monster), :behavior => :revoke + assert_no_migration "db/migrate/add_devise_to_monsters.rb" + assert_migration "db/migrate/devise_create_monsters.rb" run_generator %w(monster), :behavior => :revoke assert_no_file "app/models/monster.rb" assert_no_migration "db/migrate/devise_create_monsters.rb"