解析许可参数的嵌套哈希键

时间:2017-03-23 09:15:59

标签: ruby-on-rails ruby

目前,我有哈希

{
 :home_page=>{
   :hot_products=>{
     :enabled=>true, :always_enable=>false,:order=>0
   },
   :recent_products=>{
     :enabled=>true, :always_enable=>true, :order=>1
   },
   :event_promotion=>{
     :enabled=>true, :always_enable=>false,:order=>2
   }
  }
}

我想要使用哈希键而不是像这样的硬代码的许可证参数:

params.require(:tob).permit home_page: [hot_products: [:enabled, :always_enable]]

我们有没有办法获得上面的哈希键以允许参数?

2 个答案:

答案 0 :(得分:1)

原始答案

我猜你可以迭代你的参数hash并提取密钥来构建允许的hash(未经测试):

def recursive_hash_keys(hash)
  hash.map do |key, value|
    if value.is_a? Hash
      { key => recursive_hash_keys(value) }
    else
      key
    end
  end
end


def tob_params
  params.require(:tob).permit(
    home_page: recursive_hash_keys(params[:tob][:home_page])
  )
end

但是,我不明白你为什么要这样做。给定的解决方案引入了安全漏洞。允许的参数应该被硬过滤,因为在Rails 4中引入的这种机制应该取代旧的受保护的属性机制。随便做,但我只是让你知道你不应该:)。

修改

要匹配您实际想要做的事情(在这种情况下没有安全问题):

DEFAULT_PARAMS = YAML::load( <<EOY )
home_page:
  hot_products:
    enabled: true 
    always_enable: false
    order: 0
  recent_products:
    enabled: true 
    always_enable: true
    order: 1
  event_promotion:
    enabled: true 
    always_enable: false
    order: 2
EOY

# [...]

def recursive_hash_keys(hash)
  hash.map do |key, value|
    if value.is_a? Hash
      { key => recursive_hash_keys(value) }
    else
      key
    end
  end
end

def tob_params
  DEFAULT_PARAMS.merge(
    params
    .require(:tob)
    .permit(recursive_hash_keys(DEFAULT_PARAMS))
  )
end

通过,如果我正确地猜测你想在这里做什么,我建议你按照“轨道的方式”进行:

希望这有帮助,欢呼!

答案 1 :(得分:1)

这可行吗

1)获取所需的哈希

params[:home_page].keys
=> [:hot_products, :recent_products, :event_promotion]

2)使用上面的结果形成一个允许的哈希。这是其中一种方法

> params[:home_page].keys.map { |k| {"#{k}": [:enabled, :always_enable]} }
=> [{:hot_products=>[:enabled, :always_enable]},
 {:recent_products=>[:enabled, :always_enable]},
 {:event_promotion=>[:enabled, :always_enable]}]

注意:这会削弱strong_parameters

带来的安全性
相关问题