Class: RailsBestPractices::Reviews::MoveCodeIntoModelReview

Inherits:
Review show all
Defined in:
lib/rails_best_practices/reviews/move_code_into_model_review.rb

Overview

Review a view file to make sure there is no complex logic call for model.

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

Implementation:

Review process:

check if there are multiple method calls or attribute assignments apply to one subject,
and the subject is a local variable or instance variable,
then 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 = {}) ⇒ MoveCodeIntoModelReview

Returns a new instance of MoveCodeIntoModelReview.



29
30
31
32
# File 'lib/rails_best_practices/reviews/move_code_into_model_review.rb', line 29

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



25
26
27
# File 'lib/rails_best_practices/reviews/move_code_into_model_review.rb', line 25

def interesting_files
  VIEW_FILES
end

#interesting_nodesObject



21
22
23
# File 'lib/rails_best_practices/reviews/move_code_into_model_review.rb', line 21

def interesting_nodes
  [:if]
end

#start_if(node) ⇒ Object

check if node to see whose conditional statementnodes contain multiple call nodes with same subject who is a local variable or instance variable.

it will check every call and attrasgn nodes in the conditional statement 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 the conditional statement nodes should be moved into model.



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

def start_if(node)
  node.conditional_statement.grep_nodes(:node_type => [:call, :attrasgn]) { |child_node| remember_variable_use_count(child_node) }

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

  reset_variable_use_count
end

#urlObject



17
18
19
# File 'lib/rails_best_practices/reviews/move_code_into_model_review.rb', line 17

def url
  "http://rails-bestpractices.com/posts/25-move-code-into-model"
end