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)
未经测试,但你可以尝试:
<%= 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)
is_a? Hash直到第 2 级。尚不支持第三级等,因此最好编写一个helper方法来动态生成所有这些输入字段(无论哈希值有多深)。