【问题标题】:Is it possible to show a form with fields for the jsonb properties是否可以显示带有 jsonb 属性字段的表单
【发布时间】:2015-04-08 22:59:03
【问题描述】:

我有一个带有 jsonb 字段的 Product 模型,名为 dynamic

我实际上有 2 条产品记录

产品 1:

dynamic = {"name": "super product 1", "description": "lorem ipsum text" }

产品 2:

dynamic = {"title": "this is an ebook", "author": "john doe", "creation_date": "2015"}

要编辑每个产品,我需要显示一个表单。对于产品 1,表单将包含 2 个字段(名称和描述),对于 产品 2,表单将包含 3 个字段(标题、作者、创作日期)

我搜索过,但似乎我找到的所有文章都在谈论如何使用控制台保存或编辑 json 字段,但没有人谈论如何使用表单。

有什么帮助吗?谢谢

【问题讨论】:

    标签: ruby-on-rails json postgresql jsonb


    【解决方案1】:

    如果您使用的是 simple_form,您可以执行以下操作:

    f.simple_fields_for :dynamic do |dynamic_f|
      @product.dynamic.each do |k,v|
        dynamic_f.input k.to_sym
      end
    end
    

    别忘了在控制器中允许这样的参数:

    params.require(:product).permit(dynamic: [:name, :description, :title, :author, :creation_date]])
    

    将您需要的特定参数列入白名单始终是一种好习惯,但如果您想允许动态内部的所有内容,您可以尝试以下操作:

    params.require(:product)permit( **permitted paramters in here** ).tap do |whitelisted|
      whitelisted[:dynamic] = params[:product][:dynamic] if params[:product][:dynamic]
    end
    

    或允许所有产品模型使用:

    params.require(:product).permit!
    

    不建议这样做,因为它会使您在 json 字段之外的其他数据保持打开状态以被覆盖。

    【讨论】:

    • 我应该做些什么来允许这些键在强参数中或在模型中使用 attr_accessor 或类似的东西?
    • 我用强参数来做。我更新了答案以显示我通常如何处理它。
    • 感谢您的更新,但是“动态”字段的键不固定,我每次创建不同的键,它们不仅可以是其他东西(名称,描述,标题,autohor,creation_date)
    • 哇非常感谢您的更新。你能解释一下带有“tap”方法的代码是做什么的吗?
    • tap 是一个帮助器,用于“点击”到方法链中,该方法链在块内产生对象,然后在最后返回对象。基本上它所做的是扩展允许的参数以允许所有参数通过 :dynamic 传递给控制器​​。您可以在此处找到有关此方法的一些有趣的讨论,以获取强参数:github.com/rails/rails/issues/9454
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    相关资源
    最近更新 更多