aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
authorKasper Timm Hansen <kaspth@gmail.com>2016-08-02 12:50:26 +0200
committerGitHub <noreply@github.com>2016-08-02 12:50:26 +0200
commit6b441559b1e4bfa080e99a9f55fb5e8f3ced4864 (patch)
tree3bc464d5c6c38e7480e9770273f4ce21c03561d3 /actionpack
parentc205e3fca333e7c24dd1e36d439f83cdaf074e44 (diff)
parent31448f2b7fa6f3920485229e5710d9fcf87f190d (diff)
downloadrails-6b441559b1e4bfa080e99a9f55fb5e8f3ced4864.tar.gz
rails-6b441559b1e4bfa080e99a9f55fb5e8f3ced4864.tar.bz2
rails-6b441559b1e4bfa080e99a9f55fb5e8f3ced4864.zip
Merge pull request #26017 from kaspth/parameters-yaml-format-backwardscompatibility
Make Parameters support legacy YAML encodings.
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/lib/action_controller/metal/strong_parameters.rb19
-rw-r--r--actionpack/test/controller/parameters/serialization_test.rb32
2 files changed, 51 insertions, 0 deletions
diff --git a/actionpack/lib/action_controller/metal/strong_parameters.rb b/actionpack/lib/action_controller/metal/strong_parameters.rb
index 26794c67b7..98624ba103 100644
--- a/actionpack/lib/action_controller/metal/strong_parameters.rb
+++ b/actionpack/lib/action_controller/metal/strong_parameters.rb
@@ -7,6 +7,12 @@ require 'action_dispatch/http/upload'
require 'rack/test'
require 'stringio'
require 'set'
+require 'yaml'
+
+# Wire up YAML format compatibility with Rails 4.2. Makes the YAML parser call
+# `init_with` when it encounters `!ruby/hash-with-ivars:ActionController::Parameters`,
+# instead of trying to parse it as a regular hash subclass.
+YAML.load_tags['!ruby/hash-with-ivars:ActionController::Parameters'] = 'ActionController::Parameters'
module ActionController
# Raised when a required parameter is missing.
@@ -591,6 +597,19 @@ module ActionController
"<#{self.class} #{@parameters} permitted: #{@permitted}>"
end
+ def init_with(coder) # :nodoc:
+ if coder.map['elements']
+ # YAML's Hash subclass format from Rails 4.2, where keys and values
+ # were stored under an elements hash and `permitted` within an ivars hash.
+ @parameters = coder.map['elements'].with_indifferent_access
+ @permitted = coder.map['ivars'][:@permitted]
+ else
+ # YAML's Object format. Only needed because of the format
+ # backwardscompability above, otherwise equivalent to YAML's initialization.
+ @parameters, @permitted = coder.map['parameters'], coder.map['permitted']
+ end
+ end
+
def method_missing(method_sym, *args, &block)
if @parameters.respond_to?(method_sym)
message = <<-DEPRECATE.squish
diff --git a/actionpack/test/controller/parameters/serialization_test.rb b/actionpack/test/controller/parameters/serialization_test.rb
new file mode 100644
index 0000000000..5d389f5a4c
--- /dev/null
+++ b/actionpack/test/controller/parameters/serialization_test.rb
@@ -0,0 +1,32 @@
+require 'abstract_unit'
+require 'action_controller/metal/strong_parameters'
+require 'active_support/core_ext/string/strip'
+
+class ParametersSerializationTest < ActiveSupport::TestCase
+ test 'yaml serialization' do
+ assert_equal <<-end_of_yaml.strip_heredoc, YAML.dump(ActionController::Parameters.new(key: :value))
+ --- !ruby/object:ActionController::Parameters
+ parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
+ key: :value
+ permitted: false
+ end_of_yaml
+ end
+
+ test 'yaml deserialization' do
+ params = ActionController::Parameters.new(key: :value)
+ roundtripped = YAML.load(YAML.dump(params))
+
+ assert_equal params, roundtripped
+ assert_not roundtripped.permitted?
+ end
+
+ test 'yaml backwardscompatible with hash inheriting parameters' do
+ assert_equal ActionController::Parameters.new(key: :value), YAML.load(<<-end_of_yaml.strip_heredoc)
+ --- !ruby/hash-with-ivars:ActionController::Parameters
+ elements:
+ key: :value
+ ivars:
+ :@permitted: false
+ end_of_yaml
+ end
+end