Mongoid中使用强参数的动态哈希字段

时间:2013-08-27 01:37:33

标签: mongoid ruby-on-rails-4 strong-parameters

因此,似乎没有任何干净的方法来通常允许具有强参数的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补丁来允许这种情况。

3 个答案:

答案 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