我在更新模型中的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!
最佳答案
我没有完整的应用程序,但是我假设当您仅输入这两个参数时,它不会执行您在控制台中运行的相同操作。提交表单后-您的所有参数都将被接受,不仅是您添加到表单中的参数。
为了防止这种情况-您可以将所有其他字段添加为隐藏字段,并以此方式保存数据。