6

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

4

3 回答 3

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

于 2013-08-27T03:24:18.307 回答
0

如有必要,也可以允许嵌套属性,如下所示:

def create_params
  params[:book]["chapter"].permit(:content)
end
于 2014-09-07T12:38:35.880 回答
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参数,您可以像这样使用它:

def item_params
  params.require(:item).permit(values: permit_recursive_params(params[:item][:values]))
end
于 2016-03-21T16:02:43.843 回答