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 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::ALL_FILES, Core::Check::CONTROLLER_FILES, Core::Check::DEPLOY_FILES, Core::Check::HELPER_FILES, Core::Check::MAILER_FILES, Core::Check::MIGRATION_FILES, Core::Check::MODEL_FILES, Core::Check::PARTIAL_VIEW_FILES, Core::Check::ROUTE_FILES, Core::Check::SCHEMA_FILE, Core::Check::VIEW_FILES

Instance Method Summary collapse

Methods inherited from Review

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

Methods inherited from Core::Check

add_callback, #add_error, #after_prepare, #after_review, callbacks, #errors, #increment_total_files_checked!, #interesting_files, interesting_files, interesting_nodes, #interesting_nodes, #method_missing, #node_end, #node_start, #parse_file?, #result, #total_files_checked

Constructor Details

#initialize(options = {}) ⇒ ReplaceComplexCreationWithFactoryMethodReview

Returns a new instance of ReplaceComplexCreationWithFactoryMethodReview.



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

def initialize(options = {})
  super()
  @assigns_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

#start_def(node) ⇒ Object

check method define node to see if there are multiple assignments, more than @assigns_count, on one variable before save.

it wll check every attrasgn nodes in method define node, if there are multiple assign nodes who have the same subject, and the subject is a 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.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb', line 38

def start_def(node)
  node.recursive_children do |child_node|
    case child_node.sexp_type
    when :assign
      if :"." == child_node.subject[2]
        remember_variable_use_count(child_node)
      end
    when :call
      check_variable_save(child_node)
    else
    end
  end
  reset_variable_use_count
end

#urlObject



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

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