diff --git a/railties/lib/generators/named_base.rb b/railties/lib/generators/named_base.rb index 9538931a6ef9c59120113e6b0f458f1f3c759f84..553850fec588c8bb8a4ff3321b8aa5bd5e9632ae 100644 --- a/railties/lib/generators/named_base.rb +++ b/railties/lib/generators/named_base.rb @@ -7,49 +7,21 @@ class NamedBase < Base argument :name, :type => :string attr_reader :class_name, :singular_name, :plural_name, :table_name, - :class_path, :file_path, :class_nesting, :class_nesting_depth + :class_path, :file_path, :class_nesting_depth alias :file_name :singular_name - class << self - # Add a class collisions name to be checked on class initialization. You - # can supply a hash with a :prefix or :suffix to be tested. - # - # ==== Examples - # - # check_class_collision :suffix => "Observer" - # - # If the generator is invoked with class name Admin, it will check for - # the presence of "AdminObserver". - # - def check_class_collision(options={}) - @class_collisions = options - end - - # Returns the class collisions for this class and retreives one from - # superclass. The from_superclass method used below is from Thor. - # - def class_collisions #:nodoc: - @class_collisions ||= from_superclass(:class_collisions, nil) - end - end - def initialize(*args) #:nodoc: super assign_names!(self.name) parse_attributes! if respond_to?(:attributes) - - if self.class.class_collisions - value = add_prefix_and_suffix(class_name, self.class.class_collisions) - class_collisions(value) - end end protected def assign_names!(given_name) #:nodoc: - self.name, @class_path, @file_path, @class_nesting, @class_nesting_depth = extract_modules(given_name) - @class_name_without_nesting, @singular_name, @plural_name = inflect_names(self.name) + base_name, @class_path, @file_path, class_nesting, @class_nesting_depth = extract_modules(given_name) + class_name_without_nesting, @singular_name, @plural_name = inflect_names(base_name) @table_name = if !defined?(ActiveRecord::Base) || ActiveRecord::Base.pluralize_table_names plural_name @@ -58,11 +30,11 @@ def assign_names!(given_name) #:nodoc: end @table_name.gsub! '/', '_' - if @class_nesting.empty? - @class_name = @class_name_without_nesting + if class_nesting.empty? + @class_name = class_name_without_nesting else - @table_name = @class_nesting.underscore << "_" << @table_name - @class_name = "#{@class_nesting}::#{@class_name_without_nesting}" + @table_name = class_nesting.underscore << "_" << @table_name + @class_name = "#{class_nesting}::#{class_name_without_nesting}" end end @@ -97,12 +69,52 @@ def inflect_names(name) #:nodoc: [camel, under, plural] end - # Receives a name and add suffix and prefix values frrm hash. + # Add a class collisions name to be checked on class initialization. You + # can supply a hash with a :prefix or :suffix to be tested. + # + # ==== Examples + # + # check_class_collision :suffix => "Observer" # - def add_prefix_and_suffix(name, hash) #:nodoc: - "#{hash[:prefix]}#{name}#{hash[:suffix]}" + # If the generator is invoked with class name Admin, it will check for + # the presence of "AdminObserver". + # + def self.check_class_collision(options={}) + define_method :check_class_collision do + name = if self.respond_to?(:controller_class_name) # for ControllerNamedBase + controller_class_name + else + class_name + end + + class_collisions "#{options[:prefix]}#{name}#{options[:suffix]}" + end end + end + + # Deal with controller named base on scaffold + # + module ControllerNamedBase + def self.included(base) #:nodoc: + base.send :attr_reader, :controller_name, :controller_class_name, :controller_file_name + end + + # Set controller variables on initialization. + # + def initialize(*args) + super + @controller_name = name.pluralize + base_name, class_path, file_path, class_nesting, class_nesting_depth = extract_modules(@controller_name) + class_name_without_nesting, @controller_file_name, controller_plural_name = inflect_names(base_name) + + @controller_class_name = if class_nesting.empty? + class_name_without_nesting + else + "#{class_nesting}::#{class_name_without_nesting}" + end + end end + end end diff --git a/railties/lib/generators/rails/resource/resource_generator.rb b/railties/lib/generators/rails/resource/resource_generator.rb index 37aca18758ef2b0a00bd0fb6e40c2aef73909548..c8748aecf406786b84cfc7fe15d8e4b546ae1ad7 100644 --- a/railties/lib/generators/rails/resource/resource_generator.rb +++ b/railties/lib/generators/rails/resource/resource_generator.rb @@ -13,11 +13,11 @@ class ResourceGenerator < ModelGenerator #metagenerator class_option :singleton, :type => :boolean, :desc => "Supply to create a singleton controller" class_option :force_plural, :type => :boolean, :desc => "Forces the use of a plural ModelName" - def initialize(args=[], options={}, config={}) + def initialize(*args) super - if args[0] == args[0].pluralize && !self.options[:force_plural] + if name == name.pluralize && !options[:force_plural] say "Plural version of the model detected, using singularized version. Override with --force-plural." - args[0] = args[0].singularize + name.replace name.singularize end end diff --git a/railties/lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb b/railties/lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb index 3a6620ae70ea47ab382fdad5afa8f2fe58b9ca7c..e7f4fdde89e8cb49f6e5b0165a9ace5719fcc93d 100644 --- a/railties/lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb +++ b/railties/lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb @@ -1,8 +1,10 @@ module Rails module Generators class ScaffoldControllerGenerator < NamedBase - class_option :singleton, :type => :boolean, :desc => "Supply to create a singleton controller" + include ControllerNamedBase + check_class_collision :suffix => "Controller" + class_option :singleton, :type => :boolean, :desc => "Supply to create a singleton controller" def create_controller_files template 'controller.rb', File.join('app/controllers', class_path, "#{file_name}_controller.rb")