我有一个ruby 2.5
和rails 5.2
的项目。它有一个名为Fruit
的模型,其中包含两个字段:name:string
和options:json
。我想使用选项来存储一些数据,例如color
,size
等
现在我有一张表格:
<%= form_with(model: fruit, local: true) do |form| %>
<div class="field">
<%= form.label :name %>
<%= form.text_field :name %>
</div>
<div class="field">
<%= form.label :options %>
<%= form.fields :options do |field| %>
<%= field.text_field :color %>
<%= field.text_field :size %>
<% end %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
它会成功将数据保存到数据库,包括options
中的颜色和大小。但是,当我edit
时,它无法在选项中显示现有数据。
这意味着当我编辑水果时,如果我没有再次设置颜色和大小,现有数据将会丢失。
有谁知道如何让它正常工作?
标记为重复的问题不同。在那个问题中,他们询问json对象是否可以转换为字符串。
我的问题是按键显示表单中的值。
答案 0 :(得分:1)
我找到了解决方案。
表单将通过向object
发送getter方法来显示每个值。 object
作为form.object
存储在表单构建器中,代表模型。
但是,按字段创建子表单时,不包括该对象。它需要传递:
<%= form.fields :options, model: form.object.options do |field| %>
通过这种方式,field.object
将options
格式分配为Hash
。
然而,这还不够。表单尝试通过调用方法获取值。但哈希属性不能接受方法调用。 options.color
不会返回该值,因此该值尚未显示在表单上。
一种解决方案是将模型转移到OpenStruct
。 OpenStruct
允许您将密钥作为获取值的方法。因此,我使表单有效的解决方案是:
<%= form.fields :options, model: OpenStruct.new(form.object.options) do |field| %>
我会保持这个问题的开放性。如果您认为我的答案不是最佳做法或我的解释不准确,请留下您的答案。