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, unless, elsif there are multiple method calls or attribute assignments apply to one subject,
and the subject is a variable, then they should be moved into model.

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

Returns a new instance of MoveCodeIntoModelReview.



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

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

#start_if(node) ⇒ Object Also known as: start_unless, start_elsif

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

it will check every call and assignment nodes in the conditional statement nodes.

if there are multiple call and assignment nodes who have the same subject, and the subject is a variable, then the conditional statement nodes should be moved into model.



34
35
36
37
38
39
40
41
42
# File 'lib/rails_best_practices/reviews/move_code_into_model_review.rb', line 34

def start_if(node)
  node.conditional_statement.grep_nodes(:sexp_type => :call) { |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})" if count > @use_count
  end

  reset_variable_use_count
end

#urlObject



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

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