目前,我有哈希
{
: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]]
我们有没有办法获得上面的哈希键以允许参数?
答案 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