首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails ActionController::Parameters清理

Rails ActionController::Parameters清理
EN

Stack Overflow用户
提问于 2020-11-19 17:45:48
回答 1查看 137关注 0票数 0

我需要清理Rails 4中Rails5中的强参数,我使用了以下代码:

代码语言:javascript
复制
 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之后,我得到了一个哈希,所以我失去了许可,所需的方法,我试图使用切片和获取,但切片并不能真正正常工作。我不想在我的新对象中松散的de ActionController::参数属性。

那么我该如何继续呢

EN

回答 1

Stack Overflow用户

发布于 2020-11-19 21:55:30

Rails 4和Rails 5之间有许多不同之处,其中一个是强参数:

,但在Rails5中,ActionController::参数将不再从HashWithIndifferentAccess继承

作为pointed here

但是,如果您查看the documentation,您可以使用其他方法,这些方法可以在不使用deep_dup和不使用map的情况下更好地执行任务。在这种情况下,您需要对对象的值进行严格的处理。在这种情况下,您应该使用transform_values,也可以选择使用!.

重要的一点是,v可以是标量(String,Numer...)、Array或Hash或其他类型(ActiveController::Parameters)。所以你可以像这样处理:

代码语言:javascript
复制
  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::参数总是递归的)值操作封装在一个单独的方法中,以使此代码更像ruby,而不需要无限的if else链。

使用此代码,您将返回一个新的ActionController::参数,该参数将对值应用sanitazion或修改

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64909089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档