提交 b77a7dcf 编写于 作者: J José Valim

Added controller named base.

上级 d5d0b8ea
...@@ -7,49 +7,21 @@ class NamedBase < Base ...@@ -7,49 +7,21 @@ class NamedBase < Base
argument :name, :type => :string argument :name, :type => :string
attr_reader :class_name, :singular_name, :plural_name, :table_name, 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 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: def initialize(*args) #:nodoc:
super super
assign_names!(self.name) assign_names!(self.name)
parse_attributes! if respond_to?(:attributes) 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 end
protected protected
def assign_names!(given_name) #:nodoc: def assign_names!(given_name) #:nodoc:
self.name, @class_path, @file_path, @class_nesting, @class_nesting_depth = extract_modules(given_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(self.name) class_name_without_nesting, @singular_name, @plural_name = inflect_names(base_name)
@table_name = if !defined?(ActiveRecord::Base) || ActiveRecord::Base.pluralize_table_names @table_name = if !defined?(ActiveRecord::Base) || ActiveRecord::Base.pluralize_table_names
plural_name plural_name
...@@ -58,11 +30,11 @@ def assign_names!(given_name) #:nodoc: ...@@ -58,11 +30,11 @@ def assign_names!(given_name) #:nodoc:
end end
@table_name.gsub! '/', '_' @table_name.gsub! '/', '_'
if @class_nesting.empty? if class_nesting.empty?
@class_name = @class_name_without_nesting @class_name = class_name_without_nesting
else else
@table_name = @class_nesting.underscore << "_" << @table_name @table_name = class_nesting.underscore << "_" << @table_name
@class_name = "#{@class_nesting}::#{@class_name_without_nesting}" @class_name = "#{class_nesting}::#{class_name_without_nesting}"
end end
end end
...@@ -97,12 +69,52 @@ def inflect_names(name) #:nodoc: ...@@ -97,12 +69,52 @@ def inflect_names(name) #:nodoc:
[camel, under, plural] [camel, under, plural]
end 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: # If the generator is invoked with class name Admin, it will check for
"#{hash[:prefix]}#{name}#{hash[:suffix]}" # 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
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 end
end end
...@@ -13,11 +13,11 @@ class ResourceGenerator < ModelGenerator #metagenerator ...@@ -13,11 +13,11 @@ class ResourceGenerator < ModelGenerator #metagenerator
class_option :singleton, :type => :boolean, :desc => "Supply to create a singleton controller" 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" class_option :force_plural, :type => :boolean, :desc => "Forces the use of a plural ModelName"
def initialize(args=[], options={}, config={}) def initialize(*args)
super 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." 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
end end
......
module Rails module Rails
module Generators module Generators
class ScaffoldControllerGenerator < NamedBase class ScaffoldControllerGenerator < NamedBase
class_option :singleton, :type => :boolean, :desc => "Supply to create a singleton controller" include ControllerNamedBase
check_class_collision :suffix => "Controller" check_class_collision :suffix => "Controller"
class_option :singleton, :type => :boolean, :desc => "Supply to create a singleton controller"
def create_controller_files def create_controller_files
template 'controller.rb', File.join('app/controllers', class_path, "#{file_name}_controller.rb") template 'controller.rb', File.join('app/controllers', class_path, "#{file_name}_controller.rb")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册