因此,似乎没有任何干净的方法来通常允许具有强参数的Hash字段。这当然可能是一个强大的参数问题,但我很好奇是否有解决方法。我有一些带有某些领域的模型......
field :name, type: String
field :email, type: String
field :other_stuff, type: Hash, default: {}
现在我可以允许一切:
params.require(:registration).permit!
但这不是一个好主意,我想做的事情就像......
params.require(:registration).permit(:name,:email,{other_stuff:{}})
然而,对于强参数似乎不可能这样做,不可能只将哈希列入白名单(对于以SQL为中心的ActiveRecord API而言!)。任何想法如何做到这一点,或者我最好提交一个Rails补丁来允许这种情况。
答案 0 :(得分:8)
好的,经过研究,我找到了一个优雅的解决方案,我也将开始使用:
params.require(:registration).permit(:name).tap do |whitelisted|
whitelisted[:other_stuff] = params[:registration][:other_stuff]
end
来源:https://github.com/rails/rails/issues/9454#issuecomment-14167664
答案 1 :(得分:0)
如果需要,也可以允许嵌套属性,如下所示:
def create_params
params[:book]["chapter"].permit(:content)
end
答案 2 :(得分:0)
对于允许嵌套哈希的字段,我使用以下解决方案:
def permit_recursive_params(params)
params.map do |key, value|
if value.is_a?(Array)
{ key => [ permit_recursive_params(value.first) ] }
elsif value.is_a?(Hash) || value.is_a?(ActionController::Parameters)
{ key => permit_recursive_params(value) }
else
key
end
end
end
要将其应用于例如values
param,您可以像这样使用它:
def item_params
params.require(:item).permit(values: permit_recursive_params(params[:item][:values]))
end