diff --git a/railties/lib/generators/base.rb b/railties/lib/generators/base.rb index c1a384647c..a734ab764f 100644 --- a/railties/lib/generators/base.rb +++ b/railties/lib/generators/base.rb @@ -188,6 +188,21 @@ module Rails end end + # Remove a previously added hook. + # + # ==== Examples + # + # remove_hook_for :orm + # + def self.remove_hook_for(*names) + names.each do |name| + remove_class_option name + remove_task name + invocations.delete_if { |i| i[0] == name } + invocation_blocks.delete(name) + end + end + protected # This is the common method that both hook_for and invoke_if use to diff --git a/railties/lib/generators/rails/resource/resource_generator.rb b/railties/lib/generators/rails/resource/resource_generator.rb index 8d787aaa75..9c57eda7de 100644 --- a/railties/lib/generators/rails/resource/resource_generator.rb +++ b/railties/lib/generators/rails/resource/resource_generator.rb @@ -13,6 +13,17 @@ module Rails class_option :singleton, :type => :boolean, :default => false, :aliases => "-i", :desc => "Supply to create a singleton controller" + class_option :force_plural, :type => :boolean, :default => false, :aliases => "-u", + :desc => "Forces the use of a plural ModelName" + + def initialize(args=[], options={}, config={}) + super + if args[0] == args[0].pluralize && !self.options[:force_plural] + say "Plural version of the model detected, using singularized version. Override with --force-plural." + args[0] = args[0].singularize + end + end + def add_resource_route route "map.resource#{:s unless options[:singleton]} :#{pluralize?(file_name)}" end diff --git a/railties/lib/generators/rails/scaffold/USAGE b/railties/lib/generators/rails/scaffold/USAGE new file mode 100644 index 0000000000..71edd2f469 --- /dev/null +++ b/railties/lib/generators/rails/scaffold/USAGE @@ -0,0 +1,29 @@ +Description: + Scaffolds an entire resource, from model and migration to controller and + views, along with a full test suite. The resource is ready to use as a + starting point for your RESTful, resource-oriented application. + + Pass the name of the model (in singular form), either CamelCased or + under_scored, as the first argument, and an optional list of attribute + pairs. + + Attribute pairs are field:type arguments specifying the + model's attributes. Timestamps are added by default, so you don't have to + specify them by hand as 'created_at:datetime updated_at:datetime'. + + You don't have to think up every attribute up front, but it helps to + sketch out a few so you can start working with the resource immediately. + + For example, 'scaffold post title:string body:text published:boolean' + gives you a model with those three attributes, a controller that handles + the create/show/update/destroy, forms to create and edit your posts, and + an index that lists them all, as well as a map.resources :posts + declaration in config/routes.rb. + + If you want to remove all the generated files, run + 'script/destroy scaffold ModelName'. + +Examples: + `./script/generate scaffold post` + `./script/generate scaffold post title:string body:text published:boolean` + `./script/generate scaffold purchase order_id:integer amount:decimal` diff --git a/railties/lib/generators/rails/scaffold/scaffold_generator.rb b/railties/lib/generators/rails/scaffold/scaffold_generator.rb new file mode 100644 index 0000000000..1386000d9b --- /dev/null +++ b/railties/lib/generators/rails/scaffold/scaffold_generator.rb @@ -0,0 +1,9 @@ +require 'generators/rails/resource/resource_generator' + +module Rails + module Generators + class ScaffoldGenerator < ResourceGenerator + remove_hook_for :actions, :resource_controller + end + end +end diff --git a/railties/test/generators/resource_generator_test.rb b/railties/test/generators/resource_generator_test.rb index 456e6ff3ea..53e9a1e817 100644 --- a/railties/test/generators/resource_generator_test.rb +++ b/railties/test/generators/resource_generator_test.rb @@ -86,6 +86,20 @@ class ResourceGeneratorTest < GeneratorsTestCase end end + def test_plural_names_are_singularized + content = run_generator ["accounts"] + assert_file "app/models/account.rb", /class Account < ActiveRecord::Base/ + assert_file "test/unit/account_test.rb", /class AccountTest/ + assert_match /Plural version of the model detected, using singularized version. Override with --force-plural./, content + end + + def test_plural_names_can_be_forced + content = run_generator ["accounts", "--force-plural"] + assert_file "app/models/accounts.rb", /class Accounts < ActiveRecord::Base/ + assert_file "test/unit/accounts_test.rb", /class AccountsTest/ + assert_no_match /Plural version of the model detected/, content + end + protected def run_generator(args=["account"])