вложенные json-атрибуты simple_form - PullRequest
0 голосов
/ 23 января 2019

Модель Company preferences поле jsonb :

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

Следующее html input поле должно быть создано с тегом simple_form simple_fields_for

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

Я могу только 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 голосов
/ 23 января 2019

Не проверено, но вы можете попробовать:

<%= 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 до 2-го уровня. 3-й уровень и т. Д. Пока не поддерживаются, и поэтому, вероятно, лучше всего написать метод helper для динамической генерации всех этих полей ввода (сколь бы глубоким ни был этот хеш).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...