Class: RailsBestPractices::Reviews::UseObserverReview

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

Overview

Make sure to use observer (sorry we only check the mailer deliver now).

See the best practice details here rails-bestpractices.com/posts/19-use-observer.

TODO: we need a better solution, any suggestion?

Implementation:

Review process:

check all call nodes to see if they are callback definitions, like after_create, before_destroy,
if so, remember the callback methods.

check all method define nodes to see
if the method is a callback method,
and there is a mailer deliver call,
then the method should be replaced by using observer.

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

#initializeUseObserverReview

Returns a new instance of UseObserverReview.



35
36
37
38
# File 'lib/rails_best_practices/reviews/use_observer_review.rb', line 35

def initialize
  super
  @callbacks = []
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



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

def interesting_files
  MODEL_FILES
end

#interesting_nodesObject



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

def interesting_nodes
  [:defn, :call]
end

#start_call(node) ⇒ Object

check a call node.

if it is a callback definition, like

after_create :send_create_notification
before_destroy :send_destroy_notification

then remember its callback methods (:send_create_notification).



48
49
50
# File 'lib/rails_best_practices/reviews/use_observer_review.rb', line 48

def start_call(node)
  remember_callback(node)
end

#start_defn(node) ⇒ Object

check a method define node in prepare process.

if it is callback method, and there is a actionmailer deliver call in the method define node, then it should be replaced by using observer.



57
58
59
60
61
# File 'lib/rails_best_practices/reviews/use_observer_review.rb', line 57

def start_defn(node)
  if callback_method?(node) and deliver_mailer?(node)
    add_error "use observer"
  end
end

#urlObject



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

def url
  "http://rails-bestpractices.com/posts/19-use-observer"
end