【问题标题】:Dynamic hash field in Mongoid using strong parameters使用强参数的 Mongoid 中的动态哈希字段
【发布时间】:2013-08-29 14:52:48
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    好的,经过研究,我找到了一个优雅的解决方案,我也将开始使用:

    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

    【讨论】:

    • Eeeeewwww。但你是对的,这似乎是打算处理的方式。
    【解决方案2】:

    如果需要,也可以允许嵌套属性如下:

    def create_params
      params[:book]["chapter"].permit(:content)
    end
    

    【讨论】:

      【解决方案3】:

      对于允许嵌套哈希的字段,我使用以下解决方案:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 2016-07-19
        • 2014-01-04
        • 1970-01-01
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多