html - simple_form 嵌套 json 属性
问题描述
Company
模型jsonbpreferences
字段:
Company.new.preferences
=> { display_settings: { attr1: "" }}
应使用标记创建以下 htmlinput
字段simple_form
simple_fields_for
<input type="text" name="company[preferences][display_settings][attr1]">
我只能按照以下说明input
渲染一个with并且它将持久保存到数据库中: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 %>
解决方案
未经测试,但您可以尝试:
<%= 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 %>
待办事项:
- 上面的代码仅支持哈希中的 2 级深度“循环”,因为
is_a? Hash
直到 2 级的显式检查。3rd-level 等尚不支持,因此最好编写一个helper
方法来动态生成所有这些输入字段(无论散列有多深)。
推荐阅读
- regex - 为数学表达式选择列
- java - 对于具有 Java 背景的电子网络应用程序,我是否需要 Java 服务器(Tomcat、Jetty 等)?
- csv - Jmeter 循环遍历 CSV 文件的所有行
- r - 在 R 中向“rdplot”添加多个协变量
- ruby-on-rails - rails 4 belongs_to 和 has_many 属于同一模型
- typescript - TypeScript - 使用函数参数类型作为返回类型的参数(没有泛型)?
- debian - Debian Wheeze,安装 PHP 扩展
- java - int 不能被尊重 java
- c# - 获取多个属性的名称/值
- mongodb - 在查询中减去日期