首页 > 解决方案 > simple_form 嵌套 json 属性

问题描述

Company模型jsonbpreferences字段

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

应使用标记创建以下 htmlinput字段simple_formsimple_fields_for

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

我只能按照以下说明input渲染一个with并且它将持久保存到数据库中: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 %>

标签: htmlruby-on-railsjsonrubyforms

解决方案


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

<%= 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 级的显式检查。3rd-level 等尚不支持,因此最好编写一个helper方法来动态生成所有这些输入字段(无论散列有多深)。

推荐阅读