Skip to content

Commit 63edc02

Browse files
committed
Deprecate ivars in view.
Deprecate use of @logger and @action_name instance variables inside views. Please use instance methods logger and action_name instead.
1 parent 2c96f50 commit 63edc02

File tree

4 files changed

+90
-2
lines changed

4 files changed

+90
-2
lines changed

actionpack/lib/action_view/base.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ class Base
157157
attr_reader :logger, :response, :headers
158158
attr_internal :cookies, :flash, :headers, :params, :request, :response, :session
159159

160+
delegate :logger, :action_name, :to => :controller
161+
160162
attr_writer :template_format
161163

162164
# Specify trim mode for the ERB compiler. Defaults to '-'.
@@ -524,10 +526,18 @@ def delegate_compile(handler, template)
524526
def template_handler_is_compilable?(handler)
525527
handler.new(self).respond_to?(:compile)
526528
end
527-
529+
528530
# Assigns instance variables from the controller to the view.
529531
def assign_variables_from_controller
530-
@assigns.each { |key, value| instance_variable_set("@#{key}", value) }
532+
@assigns.each do |key, value|
533+
if ['logger'].include?(key)
534+
instance_variable_set("@#{key}", ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(self, key.to_sym))
535+
elsif ['action_name'].include?(key)
536+
instance_variable_set("@#{key}", ActiveSupport::Deprecation::DeprecatedInstanceVariable.new(value, key))
537+
else
538+
instance_variable_set("@#{key}", value)
539+
end
540+
end
531541
end
532542

533543

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
require File.dirname(__FILE__) + '/../abstract_unit'
2+
3+
class DeprecateIvars < ActionController::Base
4+
def use_logger
5+
render :inline => "<%= logger.class -%>"
6+
end
7+
8+
def use_old_logger
9+
render :inline => "<%= @logger.class -%>"
10+
end
11+
12+
def use_action_name
13+
render :inline => "<%= action_name -%>"
14+
end
15+
16+
def use_old_action_name
17+
render :inline => "<%= @action_name -%>"
18+
end
19+
end
20+
21+
class DeprecateIvarsTest < Test::Unit::TestCase
22+
def setup
23+
@request = ActionController::TestRequest.new
24+
@response = ActionController::TestResponse.new
25+
26+
@controller = DeprecateIvars.new
27+
@controller.logger = Logger.new(nil)
28+
29+
@request.host = "rubyonrails.com"
30+
end
31+
32+
def test_logger
33+
assert_not_deprecated { get :use_logger }
34+
assert_equal "Logger", @response.body
35+
end
36+
37+
def test_deprecated_logger
38+
assert_deprecated { get :use_old_logger }
39+
assert_equal "Logger", @response.body
40+
end
41+
42+
def test_action_name
43+
assert_not_deprecated { get :use_action_name }
44+
assert_equal "use_action_name", @response.body
45+
end
46+
47+
def test_deprecated_action_name
48+
assert_deprecated { get :use_old_action_name }
49+
assert_equal "use_old_action_name", @response.body
50+
end
51+
end

activesupport/lib/active_support/deprecation.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require 'yaml'
2+
require 'delegate'
23

34
module ActiveSupport
45
module Deprecation #:nodoc:
@@ -175,6 +176,20 @@ def warn(callstack, called, args)
175176
ActiveSupport::Deprecation.warn("#{@var} is deprecated! Call #{@method}.#{called} instead of #{@var}.#{called}. Args: #{args.inspect}", callstack)
176177
end
177178
end
179+
180+
class DeprecatedInstanceVariable < Delegator
181+
def initialize(value, method)
182+
super(value)
183+
@method = method
184+
@value = value
185+
end
186+
187+
def __getobj__
188+
ActiveSupport::Deprecation.warn("Instance variable @#{@method} is deprecated! Call instance method #{@method} instead.")
189+
@value
190+
end
191+
end
192+
178193
end
179194
end
180195

activesupport/test/deprecation_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require File.dirname(__FILE__) + '/abstract_unit'
22

33
class Deprecatee
4+
45
def initialize
56
@request = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(self, :request)
67
@_request = 'there we go'
@@ -148,4 +149,15 @@ def message
148149
assert_not_deprecated { error.message }
149150
assert_nil @last_message
150151
end
152+
153+
end
154+
155+
class DeprecatedIvarTest < Test::Unit::TestCase
156+
157+
def test_deprecated_ivar
158+
@action = ActiveSupport::Deprecation::DeprecatedInstanceVariable.new("fubar", :foobar)
159+
160+
assert_deprecated(/Instance variable @foobar is deprecated! Call instance method foobar instead/) { assert_equal "fubar", @action }
161+
end
162+
151163
end

0 commit comments

Comments
 (0)