带有“动态”键的Rails5 /强参数/ json列

时间:2017-07-24 08:48:27

标签: ruby-on-rails json postgresql jsonb

谷歌搜索,找到了很多潜在的解决方案,以正确处理它,最终得到以下,哪些工作

    def item_params
      load_params = params.require(:item).permit(
        :title,
        :content
      )
      load_params[:meta] = params[:item][:meta] if params[:item][:meta]
      load_params.permit!
    end

使用此类有效负载(查看控制台):

{
  "item" => {
    "title"=>"abc",
    "meta"=>{
      "fontcolor"=>"xyz",
    }
  }
}

日志仍显示该字段未被允许:

Unpermitted parameter: :meta

不阻塞,它确实传递了这些参数并正确保存,即使被警告过。

没有在相关列上使用序列化或任何序列化程序,因为它没有它的预期工作(与大量的帖子谈论json列和序列化,现在似乎不像现在所需要的那样)< / p>

此解决方案不适合我,同样的警告,但元参数被阻止:

def item_params
  meta_keys = params[:item][:meta].keys
  params.require(:item).permit(:title, meta: meta_keys)
end

由于这看起来有点随意,我对使用什么以及如何使用它做出最终决定感到非常不舒服;所以,如果有任何自信的建议,那么很多。

1 个答案:

答案 0 :(得分:2)

强参数的重点不允许任意参数。我建议尝试将您想要允许的所有密钥列入白名单,并且仅允许这些密钥。

但是要回答您的问题,如果您想要允许动态密钥,则应该执行此操作而不记录Unpermitted parameter:

def item_params
  meta_keys = params.require(:item).fetch(:meta, {}).keys
  params.require(:item).permit(:title,:meta => meta_keys)
end