aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib
diff options
context:
space:
mode:
Diffstat (limited to 'railties/lib')
-rw-r--r--railties/lib/generators/base.rb48
-rw-r--r--railties/lib/generators/rails/resource/resource_generator.rb23
2 files changed, 48 insertions, 23 deletions
diff --git a/railties/lib/generators/base.rb b/railties/lib/generators/base.rb
index d1543e8d94..c1a384647c 100644
--- a/railties/lib/generators/base.rb
+++ b/railties/lib/generators/base.rb
@@ -91,13 +91,29 @@ module Rails
#
# ruby script/generate controller Account --no-test-framework
#
- def self.hook_for(*names)
+ # ==== Custom invocations
+ #
+ # You can also supply a block to hook for to customize how the hook is
+ # going to be invoked. The block receives two parameters, an instance
+ # of the current class and the klass to be invoked.
+ #
+ # For example, in the resource generator, the controller should be invoked
+ # with a pluralized class name. By default, it is invoked with the same
+ # name as the resource generator, which is singular. To change this, we
+ # can give a block to customize how the controller can be invoked.
+ #
+ # hook_for :resource_controller do |instance, controller|
+ # instance.invoke controller, [ instance.name.pluralize ]
+ # end
+ #
+ def self.hook_for(*names, &block)
default_class_options(*names)
options = names.extract_options!
verbose = options.fetch(:verbose, :blue)
names.each do |name|
invocations << [ name, base_name, generator_name ]
+ invocation_blocks[name] = block if block_given?
class_eval <<-METHOD, __FILE__, __LINE__
def invoke_for_#{name}
@@ -108,7 +124,7 @@ module Rails
if klass
say_status :invoke, options[#{name.inspect}], #{verbose.inspect}
- invoke klass
+ invoke_class_with_block #{name.inspect}, klass
else
say "Could not find and invoke '\#{options[#{name.inspect}]}'."
end
@@ -140,13 +156,19 @@ module Rails
#
# "rails:generators:webrat", "webrat:generators:controller", "webrat"
#
- def self.invoke_if(*names)
+ # ==== Custom invocations
+ #
+ # This method accepts custom invocations as in hook_for. Check hook_for
+ # for usage and examples.
+ #
+ def self.invoke_if(*names, &block)
conditional_class_options(*names)
options = names.extract_options!
verbose = options.fetch(:verbose, :blue)
names.each do |name|
invocations << [ name, base_name, generator_name ]
+ invocation_blocks[name] = block if block_given?
class_eval <<-METHOD, __FILE__, __LINE__
def invoke_if_#{name}
@@ -157,7 +179,7 @@ module Rails
if klass
say_status :invoke, #{name.inspect}, #{verbose.inspect}
- invoke klass
+ invoke_class_with_block #{name.inspect}, klass
else
say "Could not find and invoke '#{name}'."
end
@@ -168,6 +190,18 @@ module Rails
protected
+ # This is the common method that both hook_for and invoke_if use to
+ # invoke a class. It searches for a block in the invocation blocks
+ # in case the user wants to customize how the class is invoked.
+ #
+ def invoke_class_with_block(name, klass) #:nodoc:
+ if block = self.class.invocation_blocks[name]
+ block.call(self, klass)
+ else
+ invoke klass
+ end
+ end
+
# Check whether the given class names are already taken by user
# application or Ruby on Rails.
#
@@ -229,6 +263,12 @@ module Rails
@invocations ||= from_superclass(:invocations, [])
end
+ # Stores invocation blocks used on hook_for and invoke_if.
+ #
+ def self.invocation_blocks #:nodoc:
+ @invocation_blocks ||= from_superclass(:invocation_blocks, {})
+ end
+
# Creates a conditional class option with type boolean, default value
# lookup and default description.
#
diff --git a/railties/lib/generators/rails/resource/resource_generator.rb b/railties/lib/generators/rails/resource/resource_generator.rb
index f61e55a01e..8d787aaa75 100644
--- a/railties/lib/generators/rails/resource/resource_generator.rb
+++ b/railties/lib/generators/rails/resource/resource_generator.rb
@@ -3,7 +3,9 @@ require 'generators/rails/model/model_generator'
module Rails
module Generators
class ResourceGenerator < ModelGenerator
- hook_for :resource_controller
+ hook_for :resource_controller do |base, controller|
+ base.invoke controller, [ base.name.pluralize, base.options[:actions] ]
+ end
class_option :actions, :type => :array, :default => [], :banner => "ACTION ACTION",
:desc => "Actions for the resource controller", :aliases => "-a"
@@ -11,25 +13,8 @@ module Rails
class_option :singleton, :type => :boolean, :default => false, :aliases => "-i",
:desc => "Supply to create a singleton controller"
- def invoke_for_resource_controller
- return unless options[:resource_controller]
-
- klass = Rails::Generators.find_by_namespace(options[:resource_controller], :rails, :controller)
-
- if klass
- args = []
- args << pluralize?(class_name)
- args << options[:actions]
-
- say_status :invoke, options[:resource_controller], :blue
- klass.new(args, options.dup, _overrides_config).invoke(:all)
- else
- say "Could not find and invoke '#{options[:resource_controller]}'."
- end
- end
-
def add_resource_route
- route "map.resource#{"s" unless options[:singleton]} :#{pluralize?(file_name)}"
+ route "map.resource#{:s unless options[:singleton]} :#{pluralize?(file_name)}"
end
protected