【问题标题】:Rails ActionController::Parameters sanitizeRails ActionController::Parameters 清理
【发布时间】:2021-03-02 15:59:22
【问题描述】:

我需要在 Rails 4 中清理 Rails5 中的强参数,我使用了这个:

 def forest_hash(hash)
        new_hash = hash.deep_dup
        new_hash.each do |k, v|
          new_hash[k] =
            if v.is_a?(Hash)
              forest_hash(v)
            # elsif v.respond_to?(:to_unsafe_h) 
            #   forest_hash(v.to_unsafe_h)
            elsif v.is_a?(String) && DATE_TIME_REGEXP === v
              v = Time.zone.parse(v)
            elsif v == ''
              nil
            elsif v == ['']
              []
            elsif v == '<p>&nbsp;</p>'
              nil
            elsif v == 'true'
              true
            elsif v == 'false'
              false
            elsif v.is_a?(String) && v.to_i.to_s == v
              v.to_i
            elsif v.is_a?(Array) && v.count > 1
              v.delete_if { |x| x == '' }
            elsif v.is_a?(String) && base_helpers.strip_tags(v) != v
              Foresttrees::TagSanitizer.new(v).sanitize
            elsif v.is_a?(String)
              v.squish
            else
              v
            end
          if new_hash[k].is_a?(Array) && new_hash[k].all? { |vv| vv.is_a?(Hash) }
            binding.pry
            new_hash[k].map! { |vv| forest_hash(vv) }
          end
        end
      end



<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"XXXXXXX", "commit"=>"Save", "activism_tree"=><ActionController::Parameters {"name"=>"qewrqewr", "reason"=>"", "affected_locations"=>["", "global"], "risk"=>"3", "description"=>"<p>qerqewr</p>", "published_at"=>"", "published_internet_at"=>"", "related_tree_ids"=>[""], "target_customer_ids"=>["", "5f75952427e4984019f6e9d4"], "monitored_source"=>"false", "cuter"=>"qerqewrqewr", "cut_duration"=>"", "expected_date"=>"", "cut_probability"=>"", "place"=>"", "hour"=>"", "followers"=>"0", "simplified_evidences_attributes"=>{"0"=>{"name"=>"qerqewrq", "description"=>"", "type"=>"url", "url"=>"qwerqwer", "sanitized"=>"false"}}} permitted: false>, "type"=>"activism", "controller"=>"foresttrees/trees", "action"=>"create", "locale"=>"en"} permitted: false>

问题是:

之后params.each {​​ |k,v| params[k] = v }​​.class 我得到了一个哈希,所以我失去了许可证,所需的方法, 我尝试使用 slice 和 fetch 但 slice 并没有真正正常工作。而且我不想在我的新对象中丢失 de ActionController::Parameter Properties。

那么我该如何继续

【问题讨论】:

    标签: ruby ruby-on-rails-5 strong-parameters


    【解决方案1】:

    Rails 4 和 Rails 5 之间有很多不同之处,其中之一在于强参数:

    但是在 Rails 5 中,ActionController::Parameters 将不再继承 来自 HashWithIndifferentAccess

    作为pointed here

    但是,如果您查看the documentation,您可以使用其他方法可以在功能上更好地执行您的任务,而无需 deep_dup 和不使用 map!并在这种情况下以您想要的对象的值进行工作。 在这种情况下,您应该使用 transform_values 也可以与 ! 一起存在。

    重要的一点是 v 可以是标量(字符串、数字 ...)、数组或哈希或其他(ActiveController::Parameters)。所以你可以这样处理:

      def forest_hash(hash)
            hash.transform_values do |v|
              if v.is_a?(Hash) || v.is_a?(ActionController::Parameters)
                forest_hash(v)
              elsif v.is_a?(String) && DATE_TIME_REGEXP === v
                Time.zone.parse(v)
              elsif v == ''
                nil
              elsif v == ['']
                []
              elsif v == '<p>&nbsp;</p>'
                nil
              elsif v == 'true'
                true
              elsif v == 'false'
                false
              elsif v.is_a?(String) && v.to_i.to_s == v
                v.to_i
              elsif v.is_a?(Array)
                v.delete_if { |x| x == '' }.map do |vv|
                  vv.is_a?(Hash) || vv.is_a?(ActionController::Parameters) ? forest_hash(vv) : vv
                end
              elsif v.is_a?(String) && base_helpers.strip_tags(v) != v
                Foresttrees::TagSanitizer.new(v).sanitize
              elsif v.is_a?(String)
                v.squish
              else
                v
              end
            end
          end
    

    您还应该,也许将标量字符串和数组(哈希 ActiveController::Parameters 始终递归)的一些值操作封装在一个单独的方法中,以使这段代码更像红宝石,并且不需要无限的 if else 链。

    使用此代码,您将返回一个新的 ActionController::Parameters 应用对值的清理或修改

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      相关资源
      最近更新 更多