【问题标题】:simple_form nested json attributessimple_form 嵌套 json 属性
【发布时间】:2019-01-23 09:46:12
【问题描述】:

Company 模型preferences jsonb field

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

下面的htmlinput field应该用simple_form标签simple_fields_for创建

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

我只能通过遵循这个instructions 来呈现inputname="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 %>

【问题讨论】:

  • 请在生成不完整输入的地方添加代码
  • @Vasilisa 感谢您的评论。我添加了生成不完整输入的代码。
  • @FabrizioBertoglio 我本身并没有做过类似的事情,但是从您的链接来看,解决方案 3 似乎更容易(其中使用了OpenStruct)。
  • @Jay-ArPolidario 我能够实现solution 1 并生成input name="company[preferences][attr1]" />,但我需要name="company[preferences][display_attributes][attr1]" 以便rails 控制器获得正确的参数。我会尝试一些解决方法,但找不到任何关于如何使用simple_form 执行此操作的解释。非常感谢!

标签: html ruby-on-rails json ruby forms


【解决方案1】:

未经测试,但你可以试试:

<%= 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 级深度“循环”,因为在第 2 级之前对is_a? Hash 进行了显式检查。 3 级等尚不支持,因此最好编写一个 helper 方法来动态生成所有这些输入字段(无论散列有多深)。

【讨论】:

  • ^ 让我知道我的解决方案是否有效,如果有效,我将尝试为此编写一个 helper 方法,该方法将支持所有深度哈希。
  • @FabrizioBertoglio 没有问题。希望它奏效了。如果还没有,我会在有时间后进一步测试:)
  • 感谢您的回答。它帮助我找到了解决方案。如果授权,我将发布此问题的解决方案。如果我的解决方案会被客户接受,我会接受你的回答,否则我需要对这个问题设置赏金。非常感谢。祝你有美好的一天
  • @FabrizioBertoglio 哦,当然!!!随意发布您发现的解决方案:) 没问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多