未经测试,但您可以尝试:
<%= 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
方法动态生成所有这些输入字段(哈希可能有多深)。