rails_best_practices 1.10.1 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. data/.gitignore +1 -0
  2. data/README.md +11 -6
  3. data/assets/result.html.erb +76 -46
  4. data/install_supported_rubies.sh +3 -0
  5. data/lib/rails_best_practices.rb +2 -1
  6. data/lib/rails_best_practices/analyzer.rb +10 -8
  7. data/lib/rails_best_practices/core.rb +0 -4
  8. data/lib/rails_best_practices/core/check.rb +41 -117
  9. data/lib/rails_best_practices/core/error.rb +3 -9
  10. data/lib/rails_best_practices/core/runner.rb +20 -80
  11. data/lib/rails_best_practices/lexicals/long_line_check.rb +2 -1
  12. data/lib/rails_best_practices/lexicals/remove_tab_check.rb +1 -3
  13. data/lib/rails_best_practices/lexicals/remove_trailing_whitespace_check.rb +1 -3
  14. data/lib/rails_best_practices/prepares/config_prepare.rb +1 -1
  15. data/lib/rails_best_practices/prepares/controller_prepare.rb +7 -8
  16. data/lib/rails_best_practices/prepares/helper_prepare.rb +2 -2
  17. data/lib/rails_best_practices/prepares/mailer_prepare.rb +1 -1
  18. data/lib/rails_best_practices/prepares/model_prepare.rb +6 -7
  19. data/lib/rails_best_practices/prepares/route_prepare.rb +12 -13
  20. data/lib/rails_best_practices/prepares/schema_prepare.rb +2 -2
  21. data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +19 -15
  22. data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +10 -17
  23. data/lib/rails_best_practices/reviews/dry_bundler_in_capistrano_review.rb +2 -5
  24. data/lib/rails_best_practices/reviews/hash_syntax_review.rb +3 -30
  25. data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +7 -10
  26. data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +5 -9
  27. data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +10 -13
  28. data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +6 -9
  29. data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +2 -5
  30. data/lib/rails_best_practices/reviews/move_code_into_model_review.rb +7 -13
  31. data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +3 -6
  32. data/lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb +6 -9
  33. data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +3 -6
  34. data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +4 -7
  35. data/lib/rails_best_practices/reviews/not_use_time_ago_in_words_review.rb +2 -5
  36. data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +7 -10
  37. data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +2 -5
  38. data/lib/rails_best_practices/reviews/remove_empty_helpers_review.rb +2 -5
  39. data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +8 -6
  40. data/lib/rails_best_practices/reviews/remove_unused_methods_in_helpers_review.rb +1 -2
  41. data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +4 -5
  42. data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +9 -12
  43. data/lib/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review.rb +2 -13
  44. data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +18 -26
  45. data/lib/rails_best_practices/reviews/review.rb +6 -7
  46. data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +2 -5
  47. data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +2 -5
  48. data/lib/rails_best_practices/reviews/use_before_filter_review.rb +2 -5
  49. data/lib/rails_best_practices/reviews/use_model_association_review.rb +11 -14
  50. data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +11 -8
  51. data/lib/rails_best_practices/reviews/use_observer_review.rb +8 -11
  52. data/lib/rails_best_practices/reviews/use_parentheses_in_method_def_review.rb +1 -1
  53. data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +12 -18
  54. data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +7 -10
  55. data/lib/rails_best_practices/reviews/use_scope_access_review.rb +4 -10
  56. data/lib/rails_best_practices/version.rb +1 -1
  57. data/rails_best_practices.gemspec +1 -1
  58. data/rails_best_practices.yml +5 -5
  59. data/spec/rails_best_practices/core/check_spec.rb +0 -67
  60. data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +0 -1
  61. data/spec/rails_best_practices/prepares/model_prepare_spec.rb +0 -4
  62. data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +3 -30
  63. data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +22 -0
  64. data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +19 -0
  65. data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +2 -2
  66. data/spec/spec_helper.rb +0 -4
  67. metadata +28 -41
  68. data/Gemfile.lock +0 -71
  69. data/lib/rails_best_practices/core/checking_visitor.rb +0 -80
  70. data/lib/rails_best_practices/core/nil.rb +0 -37
  71. data/lib/rails_best_practices/core_ext/enumerable.rb +0 -9
  72. data/lib/rails_best_practices/core_ext/sexp.rb +0 -840
  73. data/spec/rails_best_practices/core/checking_visitor_spec.rb +0 -79
  74. data/spec/rails_best_practices/core/nil_spec.rb +0 -37
  75. data/spec/rails_best_practices/core_ext/enumerable_spec.rb +0 -7
  76. data/spec/rails_best_practices/core_ext/sexp_spec.rb +0 -613
@@ -4,14 +4,12 @@ module RailsBestPractices
4
4
  # Error is the violation to rails best practice.
5
5
  #
6
6
  # it indicates the filenname, line number and error message for the violation.
7
- class Error
8
- attr_reader :filename, :line_number, :message, :type, :url
7
+ class Error < CodeAnalyzer::Warning
8
+ attr_reader :type, :url
9
9
  attr_accessor :git_commit, :git_username, :hg_commit, :hg_username, :highlight
10
10
 
11
11
  def initialize(options={})
12
- @filename = options[:filename]
13
- @line_number = options[:line_number].to_s
14
- @message = options[:message]
12
+ super
15
13
  @type = options[:type]
16
14
  @url = options[:url]
17
15
  @git_commit = options[:git_commit]
@@ -28,10 +26,6 @@ module RailsBestPractices
28
26
  def first_line_number
29
27
  line_number.split(',').first
30
28
  end
31
-
32
- def to_s
33
- "#{@filename}:#{@line_number} - #{@message}"
34
- end
35
29
  end
36
30
  end
37
31
  end
@@ -1,6 +1,5 @@
1
1
  # encoding: utf-8
2
2
  require 'yaml'
3
- require 'ripper'
4
3
  require 'active_support/inflector'
5
4
  require 'active_support/core_ext/object/blank'
6
5
  begin
@@ -19,7 +18,6 @@ module RailsBestPractices
19
18
  # 2. review process, it does real check, if the source code violates some best practices, the violations will be notified.
20
19
  class Runner
21
20
  attr_reader :checks
22
- attr_accessor :debug, :whiny, :color
23
21
 
24
22
  # set the base path.
25
23
  #
@@ -50,66 +48,46 @@ module RailsBestPractices
50
48
  @reviews = reviews.empty? ? load_reviews : reviews
51
49
  load_plugin_reviews if reviews.empty?
52
50
 
53
- @checker ||= CheckingVisitor.new(prepares: @prepares, reviews: @reviews, lexicals: @lexicals)
54
- @debug = false
55
- @whiny = false
51
+ @lexical_checker ||= CodeAnalyzer::CheckingVisitor::Plain.new(checkers: @lexicals)
52
+ @prepare_checker ||= CodeAnalyzer::CheckingVisitor::Default.new(checkers: @prepares)
53
+ @review_checker ||= CodeAnalyzer::CheckingVisitor::Default.new(checkers: @reviews)
56
54
  end
57
55
 
58
56
  # lexical analysis the file.
59
57
  #
60
- # @param [String] filename name of the file
61
- # @param [String] content content of the file
58
+ # @param [String] filename of the file
59
+ # @param [String] content of the file
62
60
  def lexical(filename, content)
63
- puts filename if @debug
64
- @checker.lexical(filename, content)
61
+ @lexical_checker.check(filename, content)
65
62
  end
66
63
 
67
- # lexical analysis the file.
68
- #
69
- # @param [String] filename
70
- def lexical_file(filename)
71
- lexical(filename, read_file(filename))
64
+ def after_lexical
65
+ @lexical_checker.after_check
72
66
  end
73
67
 
74
- # parepare a file's content with filename.
68
+ # parepare the file.
75
69
  #
76
- # @param [String] filename name of the file
77
- # @param [String] content content of the file
70
+ # @param [String] filename of the file
71
+ # @param [String] content of the file
78
72
  def prepare(filename, content)
79
- puts filename if @debug
80
- node = parse_ruby(filename, content)
81
- if node
82
- node.file = filename
83
- node.prepare(@checker)
84
- end
73
+ @prepare_checker.check(filename, content)
85
74
  end
86
75
 
87
- # parapare the file.
88
- #
89
- # @param [String] filename
90
- def prepare_file(filename)
91
- prepare(filename, read_file(filename))
76
+ def after_prepare
77
+ @prepare_checker.after_check
92
78
  end
93
79
 
94
- # review a file's content with filename.
80
+ # review the file.
95
81
  #
96
- # @param [String] filename name of the file
97
- # @param [String] content content of the file
82
+ # @param [String] filename of the file
83
+ # @param [String] content of the file
98
84
  def review(filename, content)
99
- puts filename if @debug
100
85
  content = parse_html_template(filename, content)
101
- node = parse_ruby(filename, content)
102
- if node
103
- node.file = filename
104
- node.review(@checker)
105
- end
86
+ @review_checker.check(filename, content)
106
87
  end
107
88
 
108
- # review the file.
109
- #
110
- # @param [String] filename
111
- def review_file(filename)
112
- review(filename, read_file(filename))
89
+ def after_review
90
+ @review_checker.after_check
113
91
  end
114
92
 
115
93
  # get all errors from lexicals and reviews.
@@ -119,45 +97,7 @@ module RailsBestPractices
119
97
  @errors ||= (@reviews + @lexicals).collect {|check| check.errors}.flatten
120
98
  end
121
99
 
122
- def after_lexical; end
123
-
124
- # provide a handler after all files reviewed.
125
- def after_prepare
126
- filename = "rails_best_practices.after_prepare"
127
- content = "class RailsBestPractices::AfterPrepare; end"
128
- node = parse_ruby(filename, content)
129
- node.file = filename
130
- node.prepare(@checker)
131
- end
132
-
133
- # provide a handler after all files reviewed.
134
- def after_review
135
- filename = "rails_best_practices.after_review"
136
- content = "class RailsBestPractices::AfterReview; end"
137
- node = parse_ruby(filename, content)
138
- node.file = filename
139
- node.review(@checker)
140
- end
141
-
142
100
  private
143
- # parse ruby code.
144
- #
145
- # @param [String] filename is the filename of ruby file.
146
- # @param [String] content is the source code of ruby file.
147
- def parse_ruby(filename, content)
148
- begin
149
- Sexp.from_array(Ripper::SexpBuilder.new(content).parse)
150
- rescue Exception => e
151
- if @debug
152
- warning = "#{filename} looks like it's not a valid Ruby file. Skipping..."
153
- warning = warning.red if self.color
154
- puts warning
155
- end
156
- raise e if @whiny
157
- nil
158
- end
159
- end
160
-
161
101
  # parse html tempalte code, erb, haml and slim.
162
102
  #
163
103
  # @param [String] filename is the filename of the erb, haml or slim code.
@@ -1,5 +1,6 @@
1
1
  # encoding: utf-8
2
- require 'rails_best_practices/reviews/review'
2
+ require 'rails_best_practices/core/check'
3
+
3
4
  module RailsBestPractices
4
5
  module Lexicals
5
6
  # Keep lines fewer than 80 characters.
@@ -7,9 +7,7 @@ module RailsBestPractices
7
7
  #
8
8
  # See the best practice details here http://rails-bestpractices.com/posts/81-remove-tab
9
9
  class RemoveTabCheck < Core::Check
10
- def url
11
- "http://rails-bestpractices.com/posts/81-remove-tab"
12
- end
10
+ url "http://rails-bestpractices.com/posts/81-remove-tab"
13
11
 
14
12
  # check if the content of file contains a tab.
15
13
  #
@@ -7,9 +7,7 @@ module RailsBestPractices
7
7
  #
8
8
  # See the best practice details here http://rails-bestpractices.com/posts/60-remove-trailing-whitespace
9
9
  class RemoveTrailingWhitespaceCheck < Core::Check
10
- def url
11
- "http://rails-bestpractices.com/posts/60-remove-trailing-whitespace"
12
- end
10
+ url "http://rails-bestpractices.com/posts/60-remove-trailing-whitespace"
13
11
 
14
12
  # check if the content of file contain a trailing whitespace.
15
13
  #
@@ -11,7 +11,7 @@ module RailsBestPractices
11
11
  @configs = Prepares.configs
12
12
  end
13
13
 
14
- def start_assign(node)
14
+ add_callback :start_assign do |node|
15
15
  if node.left_value.grep_node(sexp_type: [:vcall, :var_ref], to_s: "config").present?
16
16
  @configs[node.left_value.to_s] = node.right_value.to_s
17
17
  end
@@ -8,7 +8,6 @@ module RailsBestPractices
8
8
  include Core::Check::Classable
9
9
  include Core::Check::InheritedResourcesable
10
10
  include Core::Check::Accessable
11
- include Core::Check::Afterable
12
11
 
13
12
  interesting_nodes :class, :var_ref, :vcall, :command, :def
14
13
  interesting_files CONTROLLER_FILES
@@ -24,7 +23,7 @@ module RailsBestPractices
24
23
 
25
24
  # check class node to remember the class name.
26
25
  # also check if the controller is inherit from InheritedResources::Base.
27
- def start_class(node)
26
+ add_callback :start_class do |node|
28
27
  @controllers << @klass
29
28
  if @inherited_resources
30
29
  @actions = DEFAULT_ACTIONS
@@ -32,7 +31,7 @@ module RailsBestPractices
32
31
  end
33
32
 
34
33
  # remember the action names at the end of class node if the controller is a InheritedResources.
35
- def end_class(node)
34
+ add_callback :end_class do |node|
36
35
  if @inherited_resources && "ApplicationController" != current_class_name
37
36
  @actions.each do |action|
38
37
  @methods.add_method(current_class_name, action, {"file" => node.file, "line" => node.line})
@@ -41,21 +40,21 @@ module RailsBestPractices
41
40
  end
42
41
 
43
42
  # check if there is a DSL call inherit_resources.
44
- def start_var_ref(node)
43
+ add_callback :start_var_ref do |node|
45
44
  if @inherited_resources
46
45
  @actions = DEFAULT_ACTIONS
47
46
  end
48
47
  end
49
48
 
50
49
  # check if there is a DSL call inherit_resources.
51
- def start_vcall(node)
50
+ add_callback :start_vcall do |node|
52
51
  if @inherited_resources
53
52
  @actions = DEFAULT_ACTIONS
54
53
  end
55
54
  end
56
55
 
57
56
  # restrict actions for inherited_resources
58
- def start_command(node)
57
+ add_callback :start_command do |node|
59
58
  if "include" == node.message.to_s
60
59
  @helpers.add_module_decendant(node.arguments.all.first.to_s, current_class_name)
61
60
  elsif @inherited_resources && "actions" == node.message.to_s
@@ -83,13 +82,13 @@ module RailsBestPractices
83
82
  # "create" => {"file" => "app/controllers/comments_controller.rb", "line" => 10, "unused" => false},
84
83
  # }
85
84
  # }
86
- def start_def(node)
85
+ add_callback :start_def do |node|
87
86
  method_name = node.method_name.to_s
88
87
  @methods.add_method(current_class_name, method_name, {"file" => node.file, "line" => node.line}, current_access_control)
89
88
  end
90
89
 
91
90
  # ask Reviews::RemoveUnusedMoethodsInHelperReview to check the controllers who include helpers.
92
- def after_prepare
91
+ add_callback :after_check do
93
92
  decendants = @helpers.map(&:decendants).flatten
94
93
  if decendants.present?
95
94
  Reviews::RemoveUnusedMethodsInHelpersReview.interesting_files *decendants.map { |decendant| %r|#{decendant.underscore}| }
@@ -17,7 +17,7 @@ module RailsBestPractices
17
17
  end
18
18
 
19
19
  # check module node to remember the module name.
20
- def start_module(node)
20
+ add_callback :start_module do |node|
21
21
  @helpers << Core::Mod.new(current_module_name, [])
22
22
  end
23
23
 
@@ -30,7 +30,7 @@ module RailsBestPractices
30
30
  # "update_time" => {"file" => "app/helpers/posts_helper.rb", "line" => 10, "unused" => false}
31
31
  # }
32
32
  # }
33
- def start_def(node)
33
+ add_callback :start_def do |node|
34
34
  if node.file =~ HELPER_FILES
35
35
  method_name = node.method_name.to_s
36
36
  @methods.add_method(current_module_name, method_name, {"file" => node.file, "line" => node.line}, current_access_control)
@@ -18,7 +18,7 @@ module RailsBestPractices
18
18
  #
19
19
  # if it is a subclass of ActionMailer::Base,
20
20
  # then remember its class name.
21
- def start_class(node)
21
+ add_callback :start_class do |node|
22
22
  if "ActionMailer::Base" == current_extend_class_name
23
23
  @mailers << @klass
24
24
  end
@@ -7,7 +7,6 @@ module RailsBestPractices
7
7
  class ModelPrepare < Core::Check
8
8
  include Core::Check::Classable
9
9
  include Core::Check::Accessable
10
- include Core::Check::Afterable
11
10
 
12
11
  interesting_nodes :class, :def, :defs, :command, :alias
13
12
  interesting_files MODEL_FILES
@@ -22,7 +21,7 @@ module RailsBestPractices
22
21
  end
23
22
 
24
23
  # remember the class name.
25
- def start_class(node)
24
+ add_callback :start_class do |node|
26
25
  if "ActionMailer::Base" != current_extend_class_name
27
26
  @models << @klass
28
27
  end
@@ -40,7 +39,7 @@ module RailsBestPractices
40
39
  # "create" => {"file" => "app/models/comment.rb", "line" => 10, "unused" => false, "unused" => false},
41
40
  # }
42
41
  # }
43
- def start_def(node)
42
+ add_callback :start_def do |node|
44
43
  if @klass && "ActionMailer::Base" != current_extend_class_name
45
44
  method_name = node.method_name.to_s
46
45
  @methods.add_method(current_class_name, method_name, {"file" => node.file, "line" => node.line}, current_access_control)
@@ -59,7 +58,7 @@ module RailsBestPractices
59
58
  # "create" => {"file" => "app/models/comment.rb", "line" => 10, "unused" => false, "unused" => false},
60
59
  # }
61
60
  # }
62
- def start_defs(node)
61
+ add_callback :start_defs do |node|
63
62
  if @klass && "ActionMailer::Base" != current_extend_class_name
64
63
  method_name = node.method_name.to_s
65
64
  @methods.add_method(current_class_name, method_name, {"file" => node.file, "line" => node.line}, current_access_control)
@@ -77,7 +76,7 @@ module RailsBestPractices
77
76
  # "milestones => {"has_many" => "Milestone"}
78
77
  # }
79
78
  # }
80
- def start_command(node)
79
+ add_callback :start_command do |node|
81
80
  case node.message.to_s
82
81
  when *%w(named_scope scope alias_method)
83
82
  method_name = node.arguments.all.first.to_s
@@ -101,13 +100,13 @@ module RailsBestPractices
101
100
  end
102
101
 
103
102
  # check alias node to remembr the alias methods.
104
- def start_alias(node)
103
+ add_callback :start_alias do |node|
105
104
  method_name = node.new_method.to_s
106
105
  @methods.add_method(current_class_name, method_name, {"file" => node.file, "line" => node.line}, current_access_control)
107
106
  end
108
107
 
109
108
  # after prepare process, fix incorrect associations' class_name.
110
- def after_prepare
109
+ add_callback :after_check do
111
110
  @model_associations.each do |model, model_associations|
112
111
  model_associations.each do |association_name, association_meta|
113
112
  unless @models.include?(association_meta["class_name"])
@@ -18,7 +18,7 @@ module RailsBestPractices
18
18
  end
19
19
 
20
20
  # remember route for rails3.
21
- def start_command(node)
21
+ add_callback :start_command do |node|
22
22
  case node.message.to_s
23
23
  when "resources"
24
24
  add_resources_routes(node)
@@ -42,13 +42,14 @@ module RailsBestPractices
42
42
  if :bare_assoc_hash == first_argument.sexp_type
43
43
  route_node = first_argument.hash_values.first
44
44
  # do not parse redirect block
45
- return if :method_add_arg == route_node.sexp_type
46
- controller_name, action_name = route_node.to_s.split('#')
45
+ if :method_add_arg != route_node.sexp_type
46
+ controller_name, action_name = route_node.to_s.split('#')
47
+ @routes.add_route(current_namespaces, controller_name.underscore, action_name)
48
+ end
47
49
  elsif :array == first_argument.sexp_type
48
50
  first_argument.array_values.map(&:to_s).each do |action_node|
49
51
  @routes.add_route(current_namespaces, controller_name, action_node.to_s)
50
52
  end
51
- return
52
53
  elsif :bare_assoc_hash == second_argument.try(:sexp_type)
53
54
  if second_argument.hash_value("to").present?
54
55
  controller_name, action_name = second_argument.hash_value("to").to_s.split('#')
@@ -56,10 +57,11 @@ module RailsBestPractices
56
57
  controller_name = current_controller_name
57
58
  action_name = second_argument.hash_value("action")
58
59
  end
60
+ @routes.add_route(current_namespaces, controller_name.try(:underscore), action_name)
59
61
  else
60
62
  controller_name, action_name = first_argument.to_s.split('/')
63
+ @routes.add_route(current_namespaces, controller_name.underscore, action_name)
61
64
  end
62
- @routes.add_route(current_namespaces, controller_name.try(:underscore), action_name)
63
65
  end
64
66
  when "match", "root"
65
67
  options = node.arguments.all.last
@@ -90,7 +92,7 @@ module RailsBestPractices
90
92
  end
91
93
 
92
94
  # remember route for rails2.
93
- def start_command_call(node)
95
+ add_callback :start_command_call do |node|
94
96
  case node.message.to_s
95
97
  when "resources"
96
98
  add_resources_routes(node)
@@ -109,7 +111,7 @@ module RailsBestPractices
109
111
  end
110
112
 
111
113
  # remember the namespace.
112
- def start_method_add_block(node)
114
+ add_callback :start_method_add_block do |node|
113
115
  case node.message.to_s
114
116
  when "namespace"
115
117
  @namespaces << node.arguments.all.first.to_s
@@ -134,7 +136,7 @@ module RailsBestPractices
134
136
  end
135
137
 
136
138
  # end of namespace call.
137
- def end_method_add_block(node)
139
+ add_callback :end_method_add_block do |node|
138
140
  case node.message.to_s
139
141
  when "namespace"
140
142
  @namespaces.pop
@@ -148,18 +150,15 @@ module RailsBestPractices
148
150
  end
149
151
 
150
152
  # remember current controller name, used for nested resources.
151
- def start_do_block(node)
153
+ add_callback :start_do_block, :start_brace_block do |node|
152
154
  @controller_names << @controller_name.try(:last)
153
155
  end
154
156
 
155
157
  # remove current controller name, and use upper lever resource name.
156
- def end_do_block(node)
158
+ add_callback :end_do_block, :end_brace_block do |node|
157
159
  @controller_names.pop
158
160
  end
159
161
 
160
- alias_method :start_brace_block, :start_do_block
161
- alias_method :end_brace_block, :end_do_block
162
-
163
162
  [:resources, :resource].each do |route_name|
164
163
  class_eval <<-EOF
165
164
  def add_#{route_name}_routes(node)