我在更新模型中的Rails JSON列时遇到了一些麻烦。

我有一个OrderItem模型,带有:options列,具有postgres json数据类型。

我有一个表单,我只尝试更新该JSON列中的两个属性。但是,当我从 Controller 运行更新操作时,它会将整个选项列重置为仅表单中的字段,而不是仅更新两个单独的属性。这是一个错误吗?我使用的是Rails 4.2.1,从我读到的内容应该可以正常工作,并且可以在Rails控制台中手动更新各个属性。

在我的 Controller 中:

def update
  @order_item.update(order_item_params)
  respond_with(:update)
end

private

    def order_item_params
      params.require(:order_item).permit(:product_id, :quantity, options:[:esp, :size])
    end

我的表格:
    <%= f.fields_for :options do |option| %>
        <%= option.label :size %>
        <%= option.select :size, options_for_select((5..13), item.options["size"]) %>
        <%= option.select :esp, options_for_select(["yes","no"], item.options["esp"]) %>
    <% end %>

提交该表单后,它不会更新各个属性。它将整个json列重置为仅这两个属性
Form Data
utf8:✓
_method:patch
order_item[quantity]:2
order_item[options][size]:5
order_item[options][esp]:no

在控制台中,我可以轻松地手动更新属性...
o = OrderItem.last
o.options["esp"] = "yes"
o.save

#PERSISTS!

最佳答案

我没有完整的应用程序,但是我假设当您仅输入这两个参数时,它不会执行您在控制台中运行的相同操作。提交表单后-您的所有参数都将被接受,不仅是您添加到表单中的参数。

为了防止这种情况-您可以将所有其他字段添加为隐藏字段,并以此方式保存数据。

10-07 19:33
查看更多