代码之家  ›  专栏  ›  技术社区  ›  fabOnReact

简单的嵌套JSON属性

  •  0
  • fabOnReact  · 技术社区  · 5 年前

    这个 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]">
    

    我只能渲染 输入 具有 name="company[preferences][attr1]" 通过跟踪这个 instructions 它将一直存在于数据库中:

    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 回复  |  直到 5 年前
        1
  •  1
  •   Jay-Ar Polidario    5 年前

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

    <%= 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 %>
    

    TODOs:

    • 上面的代码只支持哈希中的两级深度“循环”,因为显式检查 is_a? Hash 直到第二层。第三级,等等,还不支持,因此最好写一个 helper 方法动态生成所有这些输入字段(哈希可能有多深)。