Class: RailsBestPractices::Reviews::ReplaceComplexCreationWithFactoryMethodReview

Inherits:
Review
  • Object
show all
Defined in:
lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb

Overview

Review a controller file to make sure that complex model creation should not exist in controller, should be replaced with factory method.

See the best practice details here rails-bestpractices.com/posts/6-replace-complex-creation-with-factory-method.

Implementation:

Review process:

check all method defines in the controller files,
if there are multiple attribute assignments apply to one subject,
and the subject is a local variable or an instance variable,
and after them there is a call node with message :save or :save!,
then these attribute assignments are complex creation, should be replaced with factory method.

Constant Summary

Constants inherited from Core::Check

Core::Check::CONTROLLER_FILES, Core::Check::HELPER_FILES, Core::Check::MAILER_FILES, Core::Check::MIGRATION_FILES, Core::Check::MODEL_FILES, Core::Check::NODE_TYPES, Core::Check::PARTIAL_VIEW_FILES, Core::Check::ROUTE_FILE, Core::Check::SCHEMA_FILE, Core::Check::VIEW_FILES

Instance Attribute Summary

Attributes inherited from Core::Check

#errors

Instance Method Summary collapse

Methods inherited from Review

#equal?, #model_associations, #model_attributes, #models, #remember_variable_use_count, #reset_variable_use_count, #variable, #variable_use_count

Methods inherited from Core::Check

#add_error, #method_missing, #node_end, #node_start

Constructor Details

#initialize(options = {}) ⇒ ReplaceComplexCreationWithFactoryMethodReview

Returns a new instance of ReplaceComplexCreationWithFactoryMethodReview.



31
32
33
34
# File 'lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb', line 31

def initialize(options = {})
  super()
  @attrasgn_count = options['attribute_assignment_count'] || 2
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class RailsBestPractices::Core::Check

Instance Method Details

#interesting_filesObject



27
28
29
# File 'lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb', line 27

def interesting_files
  CONTROLLER_FILES
end

#interesting_nodesObject



23
24
25
# File 'lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb', line 23

def interesting_nodes
  [:defn]
end

#start_defn(node) ⇒ Object

check method define node to see if there are multiple attribute assignments, more than @attrasgn_count, on one local variable or instance variable before save.

it wll check every attrasgn nodes in method define node, if there are multiple attrasgn nodes who have the same subject, and the subject is a local variable or an instance variable, and after them, there is a call node with message :save or :save!, then these attribute assignments are complex creation, should be replaced with factory method.



43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb', line 43

def start_defn(node)
  node.recursive_children do |child_node|
    case child_node.node_type
    when :attrasgn
      remember_variable_use_count(child_node)
    when :call
      check_variable_save(child_node)
    else
    end
  end
  reset_variable_use_count
end

#urlObject



19
20
21
# File 'lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb', line 19

def url
  "http://rails-bestpractices.com/posts/6-replace-complex-creation-with-factory-method"
end