simple_form嵌套json属性

时间:2019-01-23 09:46:12

标签: html ruby-on-rails json ruby forms

Company模型preferences jsonb field

Company.new.preferences
=> { display_settings: { attr1: "" }}

以下html input field应该使用simple_form标签simple_fields_for

创建
<input type="text" name="company[preferences][display_settings][attr1]">

按照下面的instructions,我只能用input来渲染name="company[preferences][attr1]",它将保存在数据库中:

Company.last.preferences
=> { attr1: "" }

我正在使用以下erb

<% preferences = PreferencesDecorator.new(@company.preferences["display_settings"])
  f.simple_fields_for(preferences) do |field|
    preferences.each do |key, value| %>
     <label for="<%= key %>"><%= key %></label>
     <%= field.input_field key %>
  <% end
end %>

1 个答案:

答案 0 :(得分:1)

未经测试,但您可以尝试:

<%= f.simple_fields_for :preferences, OpenStruct.new(f.object.preferences) do |ff|
  <% ff.object.to_h.each do |key, value| %>
    <% if value.is_a? Hash %>
      <%= ff.simple_fields_for key, OpenStruct.new(value) do |fff| %>
        <% fff.object.to_h.each do |key, value| %>
          <%= fff.input key, input_html: { value: value } %>
        <% end %>
      <% end %>
    <% else %>
      <%= ff.input key, input_html: { value: value } %>
    <% end %>
  <% end %>
<% end %>

待办事项:

    上面的
  • 代码仅在哈希中支持2级深度“循环”,这是因为is_a? Hash的显式检查直到2级。尚不支持3级等,因此最好编写一种helper方法来动态生成所有这些输入字段(无论该哈希值有多深)。