簡體   English   中英

Rails:接受具有強參數的二維字符串數組

[英]Rails: Accept 2D array of strings with strong parameters

我們有一個 Rails controller 獲取以下數據:

params = ActionController::Parameters.new({
    "requests": [{
        "params": {
            "facets": ["user.id", "user.type"],
            "facetFilters": [
                ["user.type:Individual"]
            ]
        }
    }, {
        "params": {
            "facets": "user.type"
        }
    }]
})

我們想使用強參數來接受這些數據,但我還沒有看到可以讓我們在facetFilters中接受二維數組的模式。 我正在修補以下內容:

    params[:requests].each do |request|
      request[:permitted] = true
      request[:params].each do |o|
        if ['facets', 'facetFilters'].include?(o.first)
          begin
            o[:permitted] = true 
          rescue
          end
        end
      end
    end

可以看到並非所有屬性都是允許的(允許的屬性不會傳遞給子元素),因為它返回:

[<ActionController::Parameters {"params"=><ActionController::Parameters {"facets"=>["user.id", "user.type"], "facetFilters"=>[["user.type:Individual"]]} permitted: false>, "permitted"=>true} permitted: false>, <ActionController::Parameters {"params"=><ActionController::Parameters {"facets"=>"user.type"} permitted: false>, "permitted"=>true} permitted: false>]

那里有很多 permitted: false ...

有沒有可能實現這個目標? 任何指針都會非常有幫助!

我發現完成此操作的最佳方法是將 2D 數組轉換為 1D 數組,允許 1D 數組,然后將數組轉換回 2D。

nested_facet_filters = []
(params[:requests] || []).each_with_index do |r, ridx|
  if r[:params].key?(:facetFilters) && r[:params][:facetFilters].kind_of?(Array) && r[:params][:facetFilters].first.kind_of?(Array)
    # flatten the facet filters into a 1D array because Rails can't permit a 2D array
    nested_facet_filters << ridx
    r[:params][:facetFilters] = r[:params][:facetFilters].flatten
  end
end

permitted = params.permit({
  requests: [
    :query,
    :params => [
      :facets => [],
      :facetFilters => [],
    ]
  ]
}).to_h

# after permitting the params, we need to convert the facetFilters back into a 2D array
if nested_facet_filters.present?
  nested_facet_filters.each do |idx|
    # create map from facet key to array of values
    d = {}
    permitted[:requests][idx][:params][:facetFilters].each do |s|
      split = s.split(':')
      facet = split.first
      value = split[1..-1].join(':')
      if d.key?(facet)
        d[facet] << s
      else
        d[facet] = [s]
      end
    end
    # mutate facetFilters back to 2D array for posting to Algolia
    permitted[:requests][idx][:params][:facetFilters] = d.values
  end
end

在 Rails 問題跟蹤器 [線程] 中,有一個合並請求接受 2D arrays 六年開放...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM