我有一个项目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 %>
Run Code Online (Sandbox Code Playgroud)
它将成功地将数据保存到数据库中,包括 .csv 文件中的颜色和大小options。但是,它无法在选项中显示现有数据edit。
这意味着当我编辑水果时,如果我不重新设置颜色和大小,现有数据将丢失。
有谁知道如何使它正常工作?
标记为重复的问题是不同的。在那个问题中,他们询问 json 对象是否可以转换为字符串。
我的问题是按键显示表单中的值。
我找到了解决办法。
该表单将通过向 发送一个 getter 方法来显示每个值object。该object被存储在形式助洗剂form.object,和表示该模型。
但是,当按字段创建子表单时,不包括该对象。需要传入:
<%= form.fields :options, model: form.object.options do |field| %>
Run Code Online (Sandbox Code Playgroud)
这样,field.object将被分配options为Hash格式。
然而,这还不够。表单尝试通过调用方法来获取值。但是哈希属性不能接受方法调用。options.color不会返回该值,因此该值尚未显示在表单上。
一种解决方案是将模型转移到OpenStruct. OpenStruct允许您调用键作为获取值的方法。所以我使表单工作的解决方案是:
<%= form.fields :options, model: OpenStruct.new(form.object.options) do |field| %>
Run Code Online (Sandbox Code Playgroud)
我将保持这个问题开放。如果您认为我的回答不是最佳实践或我的解释不准确,请留下您的回答。
| 归档时间: |
|
| 查看次数: |
3936 次 |
| 最近记录: |