提交 daa3565a 编写于 作者: S schneems

Faster permitted_scalar_filter

When running with code triage and derailed benchmarks and focusing on this file:

Before

     16199  /Users/rschneeman/Documents/projects/rails/actionpack/lib/action_controller/metal/strong_parameters.r

After

      2280  /Users/rschneeman/Documents/projects/rails/actionpack/lib/action_controller/metal/strong_parameters.rb
上级 12fadea8
* Expose ActionController::Parameters#each_key which allows iterating over
keys without allocating an array.
*Richard Schneeman*
* Purpose metadata for signed/encrypted cookies. * Purpose metadata for signed/encrypted cookies.
Rails can now thwart attacks that attempt to copy signed/encrypted value Rails can now thwart attacks that attempt to copy signed/encrypted value
......
...@@ -132,6 +132,15 @@ class Parameters ...@@ -132,6 +132,15 @@ class Parameters
# #
# Returns a hash that can be used as the JSON representation for the parameters. # Returns a hash that can be used as the JSON representation for the parameters.
##
# :method: each_key
#
# :call-seq:
# each_key()
#
# Calls block once for each key in the parameters, passing the key.
# If no block is given, an enumerator is returned instead.
## ##
# :method: empty? # :method: empty?
# #
...@@ -204,7 +213,7 @@ class Parameters ...@@ -204,7 +213,7 @@ class Parameters
# #
# Returns a new array of the values of the parameters. # Returns a new array of the values of the parameters.
delegate :keys, :key?, :has_key?, :values, :has_value?, :value?, :empty?, :include?, delegate :keys, :key?, :has_key?, :values, :has_value?, :value?, :empty?, :include?,
:as_json, :to_s, to: :@parameters :as_json, :to_s, :each_key, to: :@parameters
# By default, never raise an UnpermittedParameters exception if these # By default, never raise an UnpermittedParameters exception if these
# params are present. The default includes both 'controller' and 'action' # params are present. The default includes both 'controller' and 'action'
...@@ -914,15 +923,18 @@ def permitted_scalar?(value) ...@@ -914,15 +923,18 @@ def permitted_scalar?(value)
# permitted_scalar_filter(params, "zipcode") # permitted_scalar_filter(params, "zipcode")
# #
# puts params.keys # => ["zipcode"] # puts params.keys # => ["zipcode"]
def permitted_scalar_filter(params, key) def permitted_scalar_filter(params, permitted_key)
if has_key?(key) && permitted_scalar?(self[key]) permitted_key = permitted_key.to_s
params[key] = self[key]
if has_key?(permitted_key) && permitted_scalar?(self[permitted_key])
params[permitted_key] = self[permitted_key]
end end
keys.grep(/\A#{Regexp.escape(key)}\(\d+[if]?\)\z/) do |k| each_key do |key|
if permitted_scalar?(self[k]) next unless key =~ /\(\d+[if]?\)\z/
params[k] = self[k] next unless $~.pre_match == permitted_key
end
params[key] = self[key] if permitted_scalar?(self[key])
end end
end end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册