带有rails

时间:2018-06-14 01:57:33

标签: 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 %>

它会成功将数据保存到数据库,包括options中的颜色和大小。但是,当我edit时,它无法在选项中显示现有数据。

这意味着当我编辑水果时,如果我没有再次设置颜色和大小,现有数据将会丢失。

有谁知道如何让它正常工作?

标记为重复的问题不同。在那个问题中,他们询问json对象是否可以转换为字符串。

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

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。

表单将通过向object发送getter方法来显示每个值。 object作为form.object存储在表单构建器中,代表模型。

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

<%= form.fields :options, model: form.object.options do |field| %>

通过这种方式,field.objectoptions格式分配为Hash

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

一种解决方案是将模型转移到OpenStructOpenStruct允许您将密钥作为获取值的方法。因此,我使表单有效的解决方案是:

<%= form.fields :options, model: OpenStruct.new(form.object.options) do |field| %>

我会保持这个问题的开放性。如果您认为我的答案不是最佳做法或我的解释不准确,请留下您的答案。