rails_best_practices 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/README.md +14 -12
- data/lib/rails_best_practices.rb +7 -21
- data/lib/rails_best_practices/core.rb +1 -0
- data/lib/rails_best_practices/core/check.rb +156 -6
- data/lib/rails_best_practices/core/checking_visitor.rb +2 -2
- data/lib/rails_best_practices/core/methods.rb +1 -0
- data/lib/rails_best_practices/core/nil.rb +10 -0
- data/lib/rails_best_practices/core/routes.rb +33 -0
- data/lib/rails_best_practices/core/runner.rb +3 -1
- data/lib/rails_best_practices/core_ext/sexp.rb +11 -0
- data/lib/rails_best_practices/prepares.rb +5 -2
- data/lib/rails_best_practices/prepares/controller_prepare.rb +8 -14
- data/lib/rails_best_practices/prepares/mailer_prepare.rb +2 -7
- data/lib/rails_best_practices/prepares/model_prepare.rb +3 -8
- data/lib/rails_best_practices/prepares/route_prepare.rb +142 -0
- data/lib/rails_best_practices/prepares/schema_prepare.rb +3 -8
- data/lib/rails_best_practices/reviews.rb +1 -0
- data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +3 -8
- data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +9 -12
- data/lib/rails_best_practices/reviews/dry_bundler_in_capistrano_review.rb +3 -8
- data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +3 -8
- data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +2 -8
- data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +3 -4
- data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +2 -8
- data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +3 -8
- data/lib/rails_best_practices/reviews/move_code_into_model_review.rb +3 -8
- data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +2 -8
- data/lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb +3 -8
- data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +3 -8
- data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +3 -8
- data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +3 -9
- data/lib/rails_best_practices/reviews/remove_empty_helpers_review.rb +3 -8
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +57 -0
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +6 -92
- data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +3 -8
- data/lib/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review.rb +3 -8
- data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +3 -8
- data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +3 -8
- data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +3 -8
- data/lib/rails_best_practices/reviews/use_before_filter_review.rb +3 -8
- data/lib/rails_best_practices/reviews/use_model_association_review.rb +3 -8
- data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +3 -8
- data/lib/rails_best_practices/reviews/use_observer_review.rb +3 -8
- data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +2 -4
- data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +2 -8
- data/lib/rails_best_practices/reviews/use_scope_access_review.rb +3 -8
- data/lib/rails_best_practices/version.rb +1 -1
- data/rails_best_practices.yml +1 -0
- data/spec/rails_best_practices/core/check_spec.rb +2 -2
- data/spec/rails_best_practices/core/checking_visitor_spec.rb +12 -32
- data/spec/rails_best_practices/core/nil_spec.rb +12 -0
- data/spec/rails_best_practices/core/routes_spec.rb +10 -0
- data/spec/rails_best_practices/core_ext/sexp_spec.rb +14 -0
- data/spec/rails_best_practices/prepares/route_prepare_spec.rb +502 -0
- data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +14 -1
- data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +20 -4
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +120 -0
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +1 -1
- metadata +113 -123
@@ -16,16 +16,15 @@ module RailsBestPractices
|
|
16
16
|
# and outer the call node, it is also a call node,
|
17
17
|
# then it violate the law of demeter.
|
18
18
|
class LawOfDemeterReview < Review
|
19
|
+
interesting_nodes :call
|
20
|
+
interesting_files ALL_FILES
|
21
|
+
|
19
22
|
ASSOCIATION_METHODS = %w(belongs_to has_one)
|
20
23
|
|
21
24
|
def url
|
22
25
|
"http://rails-bestpractices.com/posts/15-the-law-of-demeter"
|
23
26
|
end
|
24
27
|
|
25
|
-
def interesting_nodes
|
26
|
-
[:call]
|
27
|
-
end
|
28
|
-
|
29
28
|
# check the call node,
|
30
29
|
#
|
31
30
|
# if the subject of the call node is also a call node,
|
@@ -12,6 +12,8 @@ module RailsBestPractices
|
|
12
12
|
# Review process:
|
13
13
|
# only check all view files to see if there are finders, then the finders should be moved to controller.
|
14
14
|
class MoveCodeIntoControllerReview < Review
|
15
|
+
interesting_nodes :method_add_arg, :assign
|
16
|
+
interesting_files VIEW_FILES
|
15
17
|
|
16
18
|
FINDERS = %w(find all first last)
|
17
19
|
|
@@ -19,14 +21,6 @@ module RailsBestPractices
|
|
19
21
|
"http://rails-bestpractices.com/posts/24-move-code-into-controller"
|
20
22
|
end
|
21
23
|
|
22
|
-
def interesting_nodes
|
23
|
-
[:method_add_arg, :assign]
|
24
|
-
end
|
25
|
-
|
26
|
-
def interesting_files
|
27
|
-
VIEW_FILES
|
28
|
-
end
|
29
|
-
|
30
24
|
# check method_add_arg nodes.
|
31
25
|
#
|
32
26
|
# if the subject of the method_add_arg node is a constant,
|
@@ -19,18 +19,13 @@ module RailsBestPractices
|
|
19
19
|
# and the size of the array is greater than array_count defined,
|
20
20
|
# then the options_for_select method should be moved into helper.
|
21
21
|
class MoveCodeIntoHelperReview < Review
|
22
|
+
interesting_nodes :method_add_arg
|
23
|
+
interesting_files VIEW_FILES
|
24
|
+
|
22
25
|
def url
|
23
26
|
"http://rails-bestpractices.com/posts/26-move-code-into-helper"
|
24
27
|
end
|
25
28
|
|
26
|
-
def interesting_nodes
|
27
|
-
[:method_add_arg]
|
28
|
-
end
|
29
|
-
|
30
|
-
def interesting_files
|
31
|
-
VIEW_FILES
|
32
|
-
end
|
33
|
-
|
34
29
|
def initialize(options = {})
|
35
30
|
super()
|
36
31
|
@array_count = options['array_count'] || 3
|
@@ -13,18 +13,13 @@ module RailsBestPractices
|
|
13
13
|
# check if, unless, elsif there are multiple method calls or attribute assignments apply to one subject,
|
14
14
|
# and the subject is a variable, then they should be moved into model.
|
15
15
|
class MoveCodeIntoModelReview < Review
|
16
|
+
interesting_nodes :if, :unless, :elsif
|
17
|
+
interesting_files VIEW_FILES
|
18
|
+
|
16
19
|
def url
|
17
20
|
"http://rails-bestpractices.com/posts/25-move-code-into-model"
|
18
21
|
end
|
19
22
|
|
20
|
-
def interesting_nodes
|
21
|
-
[:if, :unless, :elsif]
|
22
|
-
end
|
23
|
-
|
24
|
-
def interesting_files
|
25
|
-
VIEW_FILES
|
26
|
-
end
|
27
|
-
|
28
23
|
def initialize(options={})
|
29
24
|
super()
|
30
25
|
@use_count = options['use_count'] || 2
|
@@ -15,6 +15,8 @@ module RailsBestPractices
|
|
15
15
|
# and it has a hash argument,
|
16
16
|
# then it is a complex finder, and should be moved to model's named scope.
|
17
17
|
class MoveFinderToNamedScopeReview < Review
|
18
|
+
interesting_nodes :method_add_arg
|
19
|
+
interesting_files CONTROLLER_FILES
|
18
20
|
|
19
21
|
FINDERS = %w(find all first last)
|
20
22
|
|
@@ -22,14 +24,6 @@ module RailsBestPractices
|
|
22
24
|
"http://rails-bestpractices.com/posts/1-move-finder-to-named_scope"
|
23
25
|
end
|
24
26
|
|
25
|
-
def interesting_nodes
|
26
|
-
[:method_add_arg]
|
27
|
-
end
|
28
|
-
|
29
|
-
def interesting_files
|
30
|
-
CONTROLLER_FILES
|
31
|
-
end
|
32
|
-
|
33
27
|
# check method_add_ag node if its message is one of find, all, first or last,
|
34
28
|
# and it has a hash argument,
|
35
29
|
# then the call node is the finder that should be moved to model's named_scope.
|
@@ -15,18 +15,13 @@ module RailsBestPractices
|
|
15
15
|
# and the subject is a variable,
|
16
16
|
# then they are complex model logic, and they should be moved into model.
|
17
17
|
class MoveModelLogicIntoModelReview < Review
|
18
|
+
interesting_nodes :def
|
19
|
+
interesting_files CONTROLLER_FILES
|
20
|
+
|
18
21
|
def url
|
19
22
|
"http://rails-bestpractices.com/posts/7-move-model-logic-into-the-model"
|
20
23
|
end
|
21
24
|
|
22
|
-
def interesting_nodes
|
23
|
-
[:def]
|
24
|
-
end
|
25
|
-
|
26
|
-
def interesting_files
|
27
|
-
CONTROLLER_FILES
|
28
|
-
end
|
29
|
-
|
30
25
|
def initialize(options = {})
|
31
26
|
super()
|
32
27
|
@use_count = options['use_count'] || 4
|
@@ -24,18 +24,13 @@ module RailsBestPractices
|
|
24
24
|
# and the @counter is greater than @nested_count defined,
|
25
25
|
# then it is a needless deep nesting.
|
26
26
|
class NeedlessDeepNestingReview < Review
|
27
|
+
interesting_nodes :method_add_block
|
28
|
+
interesting_files ROUTE_FILES
|
29
|
+
|
27
30
|
def url
|
28
31
|
"http://rails-bestpractices.com/posts/11-needless-deep-nesting"
|
29
32
|
end
|
30
33
|
|
31
|
-
def interesting_nodes
|
32
|
-
[:method_add_block]
|
33
|
-
end
|
34
|
-
|
35
|
-
def interesting_files
|
36
|
-
ROUTE_FILES
|
37
|
-
end
|
38
|
-
|
39
34
|
def initialize(options = {})
|
40
35
|
super()
|
41
36
|
@counter = 0
|
@@ -19,18 +19,13 @@ module RailsBestPractices
|
|
19
19
|
#
|
20
20
|
# match ':controller(/:action(/:id(.:format)))'
|
21
21
|
class NotUseDefaultRouteReview < Review
|
22
|
+
interesting_nodes :command_call, :command
|
23
|
+
interesting_files ROUTE_FILES
|
24
|
+
|
22
25
|
def url
|
23
26
|
"http://rails-bestpractices.com/posts/12-not-use-default-route-if-you-use-restful-design"
|
24
27
|
end
|
25
28
|
|
26
|
-
def interesting_nodes
|
27
|
-
[:command_call, :command]
|
28
|
-
end
|
29
|
-
|
30
|
-
def interesting_files
|
31
|
-
ROUTE_FILES
|
32
|
-
end
|
33
|
-
|
34
29
|
# check all command call nodes, compare with rails2 default route
|
35
30
|
def start_command_call(node)
|
36
31
|
if "map" == node.subject.to_s && "connect" == node.message.to_s &&
|
@@ -28,6 +28,8 @@ module RailsBestPractices
|
|
28
28
|
# whose message is get, post, update or delete,
|
29
29
|
# then these custom routes are overuse.
|
30
30
|
class OveruseRouteCustomizationsReview < Review
|
31
|
+
interesting_nodes :command_call, :method_add_block
|
32
|
+
interesting_files ROUTE_FILES
|
31
33
|
|
32
34
|
VERBS = %w(get post update delete)
|
33
35
|
|
@@ -35,14 +37,6 @@ module RailsBestPractices
|
|
35
37
|
"http://rails-bestpractices.com/posts/10-overuse-route-customizations"
|
36
38
|
end
|
37
39
|
|
38
|
-
def interesting_nodes
|
39
|
-
[:command_call, :method_add_block]
|
40
|
-
end
|
41
|
-
|
42
|
-
def interesting_files
|
43
|
-
ROUTE_FILES
|
44
|
-
end
|
45
|
-
|
46
40
|
def initialize(options = {})
|
47
41
|
super()
|
48
42
|
@customize_count = options['customize_count'] || 3
|
@@ -84,7 +78,7 @@ module RailsBestPractices
|
|
84
78
|
# it is just the count of member and collection custom routes.
|
85
79
|
def member_and_collection_count_for_rails2(node)
|
86
80
|
if "resources" == node.message.to_s
|
87
|
-
hash_node = node.arguments.all
|
81
|
+
hash_node = node.arguments.all.last
|
88
82
|
if hash_node && :bare_assoc_hash == hash_node.sexp_type
|
89
83
|
member_node = hash_node.hash_value("member")
|
90
84
|
collection_node = hash_node.hash_value("collection")
|
@@ -12,18 +12,13 @@ module RailsBestPractices
|
|
12
12
|
# Review process:
|
13
13
|
# check all helper files, if the body of module is nil, then the helper file should be removed.
|
14
14
|
class RemoveEmptyHelpersReview < Review
|
15
|
+
interesting_nodes :module
|
16
|
+
interesting_files HELPER_FILES
|
17
|
+
|
15
18
|
def url
|
16
19
|
"http://rails-bestpractices.com/posts/72-remove-empty-helpers"
|
17
20
|
end
|
18
21
|
|
19
|
-
def interesting_files
|
20
|
-
HELPER_FILES
|
21
|
-
end
|
22
|
-
|
23
|
-
def interesting_nodes
|
24
|
-
[:module]
|
25
|
-
end
|
26
|
-
|
27
22
|
# check the body of module node, if it is nil, then it should be removed.
|
28
23
|
def start_module(node)
|
29
24
|
if s(:bodystmt, s(:stmts_add, s(:stmts_new), s(:void_stmt)), nil, nil, nil) == node.body
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rails_best_practices/reviews/review'
|
3
|
+
|
4
|
+
module RailsBestPractices
|
5
|
+
module Reviews
|
6
|
+
class RemoveUnusedMethodsInControllersReview < Review
|
7
|
+
include Klassable
|
8
|
+
include Completeable
|
9
|
+
include Callable
|
10
|
+
include InheritedResourcesable
|
11
|
+
|
12
|
+
interesting_nodes :class
|
13
|
+
interesting_files CONTROLLER_FILES
|
14
|
+
|
15
|
+
EXCEPT_METHODS = %w(rescue_action)
|
16
|
+
INHERITED_RESOURCES_METHODS = %w(resource collection begin_of_association_chain build_resource)
|
17
|
+
|
18
|
+
def initialize(options={})
|
19
|
+
@controller_methods = Prepares.controller_methods
|
20
|
+
@routes = Prepares.routes
|
21
|
+
@inherited_resources = false
|
22
|
+
@except_methods = EXCEPT_METHODS + options['except_methods']
|
23
|
+
end
|
24
|
+
|
25
|
+
# mark custom inherited_resources methods as used.
|
26
|
+
def end_class(node)
|
27
|
+
if @inherited_resources
|
28
|
+
INHERITED_RESOURCES_METHODS.each do |method|
|
29
|
+
call_method(method)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# get all unused methods at the end of review process.
|
35
|
+
def on_complete
|
36
|
+
@routes.each do |route|
|
37
|
+
if "*" == route.action_name
|
38
|
+
action_names = @controller_methods.get_methods(route.controller_name_with_namespaces).map(&:method_name)
|
39
|
+
action_names.each { |action_name| call_method(action_name, route.controller_name_with_namespaces) }
|
40
|
+
else
|
41
|
+
call_method(route.action_name, route.controller_name_with_namespaces)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
@controller_methods.get_all_unused_methods.each do |method|
|
45
|
+
if !@except_methods.include?(method.method_name)
|
46
|
+
add_error "remove unused methods (#{method.class_name}##{method.method_name})", method.file, method.line
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
protected
|
52
|
+
def methods
|
53
|
+
@controller_methods
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -14,12 +14,11 @@ module RailsBestPractices
|
|
14
14
|
class RemoveUnusedMethodsInModelsReview < Review
|
15
15
|
include Klassable
|
16
16
|
include Completeable
|
17
|
+
include Callable
|
17
18
|
|
18
|
-
|
19
|
+
interesting_files ALL_FILES
|
19
20
|
|
20
|
-
|
21
|
-
[:module, :class, :call, :fcall, :command, :command_call, :method_add_arg, :var_ref, :alias, :bare_assoc_hash]
|
22
|
-
end
|
21
|
+
EXCEPT_METHODS = %w(initialize validate to_xml to_json assign_attributes after_find after_initialize)
|
23
22
|
|
24
23
|
def initialize(options={})
|
25
24
|
super()
|
@@ -27,75 +26,6 @@ module RailsBestPractices
|
|
27
26
|
@except_methods = EXCEPT_METHODS + options['except_methods']
|
28
27
|
end
|
29
28
|
|
30
|
-
# remember the message of call node.
|
31
|
-
def start_call(node)
|
32
|
-
mark_used(node.message)
|
33
|
-
end
|
34
|
-
|
35
|
-
# remember the message of fcall node.
|
36
|
-
def start_fcall(node)
|
37
|
-
mark_used(node.message)
|
38
|
-
end
|
39
|
-
|
40
|
-
# remember name of var_ref node.
|
41
|
-
def start_var_ref(node)
|
42
|
-
mark_used(node)
|
43
|
-
end
|
44
|
-
|
45
|
-
# remember the message of command call node.
|
46
|
-
def start_command_call(node)
|
47
|
-
mark_used(node.message)
|
48
|
-
end
|
49
|
-
|
50
|
-
# remember the message of command node.
|
51
|
-
# remember the argument of alias_method and alias_method_chain as well.
|
52
|
-
def start_command(node)
|
53
|
-
case node.message.to_s
|
54
|
-
when "named_scope", "scope"
|
55
|
-
# nothing
|
56
|
-
when "alias_method"
|
57
|
-
mark_used(node.arguments.all[1])
|
58
|
-
when "alias_method_chain"
|
59
|
-
method, feature = *node.arguments.all.map(&:to_s)
|
60
|
-
call_method("#{method}_with_#{feature}")
|
61
|
-
else
|
62
|
-
mark_used(node.message)
|
63
|
-
node.arguments.all.each { |argument| mark_used(argument) }
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# remember the old method of alias node.
|
68
|
-
def start_alias(node)
|
69
|
-
mark_used(node.old_method)
|
70
|
-
end
|
71
|
-
|
72
|
-
# remember hash values for hash key "methods".
|
73
|
-
#
|
74
|
-
# def to_xml(options = {})
|
75
|
-
# super options.merge(:exclude => :visible, :methods => [:is_discussion_conversation])
|
76
|
-
# end
|
77
|
-
def start_bare_assoc_hash(node)
|
78
|
-
if node.hash_keys.include? "methods"
|
79
|
-
mark_used(node.hash_value("methods"))
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
# remember the first argument for try and send method.
|
84
|
-
def start_method_add_arg(node)
|
85
|
-
case node.message.to_s
|
86
|
-
when "try"
|
87
|
-
method_name = node.arguments.all[0].to_s
|
88
|
-
call_method(method_name)
|
89
|
-
when "send"
|
90
|
-
if [:symbol_literal, :string_literal].include?(node.arguments.all[0].sexp_type)
|
91
|
-
method_name = node.arguments.all[0].to_s
|
92
|
-
call_method(method_name)
|
93
|
-
end
|
94
|
-
else
|
95
|
-
# nothing
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
29
|
# get all unused methods at the end of review process.
|
100
30
|
def on_complete
|
101
31
|
@model_methods.get_all_unused_methods.each do |method|
|
@@ -105,25 +35,9 @@ module RailsBestPractices
|
|
105
35
|
end
|
106
36
|
end
|
107
37
|
|
108
|
-
|
109
|
-
def
|
110
|
-
|
111
|
-
method_node.hash_values.each { |value_node| mark_used(value_node) }
|
112
|
-
elsif :array == method_node.sexp_type
|
113
|
-
method_node.array_values.each { |value_node| mark_used(value_node) }
|
114
|
-
else
|
115
|
-
method_name = method_node.to_s
|
116
|
-
end
|
117
|
-
call_method(method_name)
|
118
|
-
end
|
119
|
-
|
120
|
-
def call_method(method_name)
|
121
|
-
if @model_methods.has_method?(current_class_name, method_name)
|
122
|
-
@model_methods.get_method(current_class_name, method_name).mark_used
|
123
|
-
end
|
124
|
-
@model_methods.mark_parent_class_method_used(current_class_name, method_name)
|
125
|
-
@model_methods.mark_subclasses_method_used(current_class_name, method_name)
|
126
|
-
@model_methods.possible_public_used(method_name)
|
38
|
+
protected
|
39
|
+
def methods
|
40
|
+
@model_methods
|
127
41
|
end
|
128
42
|
end
|
129
43
|
end
|
data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb
CHANGED
@@ -16,18 +16,13 @@ module RailsBestPractices
|
|
16
16
|
# and after them there is a call node with message "save" or "save!",
|
17
17
|
# then these attribute assignments are complex creation, should be replaced with factory method.
|
18
18
|
class ReplaceComplexCreationWithFactoryMethodReview < Review
|
19
|
+
interesting_nodes :def
|
20
|
+
interesting_files CONTROLLER_FILES
|
21
|
+
|
19
22
|
def url
|
20
23
|
"http://rails-bestpractices.com/posts/6-replace-complex-creation-with-factory-method"
|
21
24
|
end
|
22
25
|
|
23
|
-
def interesting_nodes
|
24
|
-
[:def]
|
25
|
-
end
|
26
|
-
|
27
|
-
def interesting_files
|
28
|
-
CONTROLLER_FILES
|
29
|
-
end
|
30
|
-
|
31
26
|
def initialize(options = {})
|
32
27
|
super()
|
33
28
|
@assigns_count = options['attribute_assignment_count'] || 2
|
data/lib/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review.rb
CHANGED
@@ -13,18 +13,13 @@ module RailsBestPractices
|
|
13
13
|
# check all instance variable in partial view files,
|
14
14
|
# if exist, then they should be replaced with local variable
|
15
15
|
class ReplaceInstanceVariableWithLocalVariableReview < Review
|
16
|
+
interesting_nodes :var_ref
|
17
|
+
interesting_files PARTIAL_VIEW_FILES
|
18
|
+
|
16
19
|
def url
|
17
20
|
"http://rails-bestpractices.com/posts/27-replace-instance-variable-with-local-variable"
|
18
21
|
end
|
19
22
|
|
20
|
-
def interesting_nodes
|
21
|
-
[:var_ref]
|
22
|
-
end
|
23
|
-
|
24
|
-
def interesting_files
|
25
|
-
PARTIAL_VIEW_FILES
|
26
|
-
end
|
27
|
-
|
28
23
|
# check ivar node in partial view file,
|
29
24
|
# it is an instance variable, and should be replaced with local variable.
|
30
25
|
def start_var_ref(node)
|