simple_form 嵌套 json 属性

Fab*_*lio 2 html ruby forms json ruby-on-rails

模型Companyjsonbpreferences字段

Company.new.preferences
=> { display_settings: { attr1: "" }}
Run Code Online (Sandbox Code Playgroud)

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

<input type="text" name="company[preferences][display_settings][attr1]">
Run Code Online (Sandbox Code Playgroud)

我只能按照以下说明input渲染with ,它将持久保存到数据库中:name="company[preferences][attr1]"

Company.last.preferences
=> { attr1: "" }
Run Code Online (Sandbox Code Playgroud)

我正在使用以下内容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 %>
Run Code Online (Sandbox Code Playgroud)

Jay*_*rio 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 %>
Run Code Online (Sandbox Code Playgroud)

待办事项:

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