diff options
author | José Valim <jose.valim@gmail.com> | 2009-08-30 17:58:20 +0200 |
---|---|---|
committer | José Valim <jose.valim@gmail.com> | 2009-08-30 17:58:20 +0200 |
commit | 0efedf2a30a12cdaa261556e3684c630690afe0f (patch) | |
tree | 0f646b621abc18caa6b00c1890bd825dd0236100 /railties/lib/generators/resource_helpers.rb | |
parent | 5096ba961c49e5b419c3400acd7c87373a36d6d4 (diff) | |
download | rails-0efedf2a30a12cdaa261556e3684c630690afe0f.tar.gz rails-0efedf2a30a12cdaa261556e3684c630690afe0f.tar.bz2 rails-0efedf2a30a12cdaa261556e3684c630690afe0f.zip |
Ensure scaffold works properly even if plural name is given. [#3062]
Diffstat (limited to 'railties/lib/generators/resource_helpers.rb')
-rw-r--r-- | railties/lib/generators/resource_helpers.rb | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/railties/lib/generators/resource_helpers.rb b/railties/lib/generators/resource_helpers.rb new file mode 100644 index 0000000000..ba1444652d --- /dev/null +++ b/railties/lib/generators/resource_helpers.rb @@ -0,0 +1,74 @@ +module Rails + module Generators + # Deal with controller names on scaffold and add some helpers to deal with + # ActiveModel. + # + module ResourceHelpers + def self.included(base) #:nodoc: + base.send :attr_reader, :controller_name, :controller_class_name, :controller_file_name, + :controller_class_path, :controller_file_path + + base.send :class_option, :force_plural, :type => :boolean, :desc => "Forces the use of a plural ModelName" + end + + # Set controller variables on initialization. + # + def initialize(*args) #:nodoc: + super + + if name == name.pluralize && !options[:force_plural] + say "Plural version of the model detected, using singularized version. Override with --force-plural." + name.replace name.singularize + assign_names!(self.name) + end + + @controller_name = name.pluralize + + base_name, @controller_class_path, @controller_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 + + protected + + # Loads the ORM::Generators::ActiveModel class. This class is responsable + # to tell scaffold entities how to generate an specific method for the + # ORM. Check Rails::Generators::ActiveModel for more information. + # + def orm_class + @orm_class ||= begin + # Raise an error if the class_option :orm was not defined. + unless self.class.class_options[:orm] + raise "You need to have :orm as class option to invoke orm_class and orm_instance" + end + + active_model = "#{options[:orm].to_s.classify}::Generators::ActiveModel" + + # If the orm was not loaded, try to load it at "generators/orm", + # for example "generators/active_record" or "generators/sequel". + begin + klass = active_model.constantize + rescue NameError + require "generators/#{options[:orm]}" + end + + # Try once again after loading the file with success. + klass ||= active_model.constantize + rescue Exception => e + raise Error, "Could not load #{active_model}, skipping controller. Error: #{e.message}." + end + end + + # Initialize ORM::Generators::ActiveModel to access instance methods. + # + def orm_instance(name=file_name) + @orm_instance ||= @orm_class.new(name) + end + end + end +end |