Class: RailsBestPractices::Reviews::MoveModelLogicIntoModelReview

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

Overview

Review a controller file to make sure that complex model logic should not exist in controller, should be moved into a model.

See the best practice details here rails-bestpractices.com/posts/7-move-model-logic-into-the-model.

Implementation:

Review process:

check all method defines in the controller files,
if there are multiple method calls or attribute assignments apply to one subject,
and the subject is a local variable or an instance variable,
then they are complex model logic, and they should be moved into model.

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 = {}) ⇒ MoveModelLogicIntoModelReview

Returns a new instance of MoveModelLogicIntoModelReview.



30
31
32
33
# File 'lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb', line 30

def initialize(options = {})
  super()
  @use_count = options['use_count'] || 4
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



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

def interesting_files
  CONTROLLER_FILES
end

#interesting_nodesObject



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

def interesting_nodes
  [:defn]
end

#start_defn(node) ⇒ Object

check method define node to see if there are multiple method calls and attribute assignments (more than @use_count defined) on one local variable or instance varialbe.

it will check every call and attrasgn nodes, if there are multiple call and attrasgn nodes who have the same subject, and the subject is a local variable or an instance variable, then these method calls and attribute assignments should be moved into model.



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

def start_defn(node)
  node.grep_nodes(:node_type => [:call, :attrasgn]) do |child_node|
    remember_variable_use_count(child_node)
  end

  variable_use_count.each do |variable_node, count|
    add_error "move model logic into model (#{variable_node} use_count > #{@use_count})" if count > @use_count
  end

  reset_variable_use_count
end

#urlObject



18
19
20
# File 'lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb', line 18

def url
  "http://rails-bestpractices.com/posts/7-move-model-logic-into-the-model"
end