带有 rails 的编辑表单中的 json 字段

Ste*_*hen 7 ruby-on-rails

我有一个项目ruby 2.5rails 5.2。它有一个名为 的模型Fruit,其中包括两个字段:name:stringoptions:json。我想使用的选项来存储像一些数据colorsize等等。

现在我有一个表格:

<%= 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 对象是否可以转换为字符串。

我的问题是按键显示表单中的值。

Ste*_*hen 8

我找到了解决办法。

该表单将通过向 发送一个 getter 方法来显示每个值object。该object被存储在形式助洗剂form.object,和表示该模型。

但是,当按字段创建子表单时,不包括该对象。需要传入:

<%= form.fields :options, model: form.object.options do |field| %>
Run Code Online (Sandbox Code Playgroud)

这样,field.object将被分配optionsHash格式。

然而,这还不够。表单尝试通过调用方法来获取值。但是哈希属性不能接受方法调用。options.color不会返回该值,因此该值尚未显示在表单上。

一种解决方案是将模型转移到OpenStruct. OpenStruct允许您调用键作为获取值的方法。所以我使表单工作的解决方案是:

<%= form.fields :options, model: OpenStruct.new(form.object.options) do |field| %>
Run Code Online (Sandbox Code Playgroud)

我将保持这个问题开放。如果您认为我的回答不是最佳实践或我的解释不准确,请留下您的回答。