【问题标题】:Nested fields not submitting Rails 4嵌套字段不提交 Rails 4
【发布时间】:2016-01-04 18:22:33
【问题描述】:

我正在尝试在 Rails 4 中实现一个简单的嵌套模型形式。这可能很简单,但就是想不通。

所以我有一个编辑视图,我在其中创建嵌套字段:

    <%= f.fields_for :bankaccounts do |bankaccount| %>
     <%= render 'bankaccount_fields', :f => bankaccount %>
    <% end %>

这些工作正常,甚至链接:

    <%= link_to_add_association 'add', f, :bankaccounts , :class => "link"%>

工作正常。这些字段在单击时显示为应有的样子。

真正的问题是,当我提交表单时。它不会将已输入这些添加字段的参数发送回 Web 服务器。 (在 webrick 控制台的任何地方都看不到它们)表单只提交旧的银行帐户参数:

    "bankaccounts_attributes"=>{"0"=>{"iban"=>"121221", "swift"=>"121212", "id"=>"3"}, "1"=>{"iban"=>"33333", "swift"=>"33333", "id"=>"9"}, "2"=>{"iban"=>"121212", "swift"=>"211212", "id"=>"10"} 

以上属性应包含四个银行帐户。

FWIW:Turbolinks 也被禁用。

编辑:这是来自 bankaccount_fields 部分的代码:

 <div id="tilit">
    <div class="area-form">
       <div class="col">
          <div class="box-row">
            <label for="iban" class="label">Iban</label>
            <div class="input-row no-italic">
              <%= f.text_field :iban, :id => "iban", :class => "input-text" %>
            </div>
          </div>
        </div>
    <div class="col">
      <div class="box-row">
         <label for="swift" class="label">Swift</label>
         <div class="input-row no-italic">
           <%= f.text_field :swift, :id => "swift", :class => "input-text" %>
         </div>
      </div>
    </div>
 </div>

pic of inspect element

编辑:调试器输出 reg。参数:

(rdb:2) @_params {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"181xsndllcPmpvpMaDi70IXh8SpaSYxs0eiSo19qwfI=", "producer"=>{"name"=>"Anne", "RH_nro"=>" ", "ytunnus"=>"", "prepaymentpercentage"=>"", "streetaddress"=>"", "zip"=>"", "city"=>"", "www"=>"", "bankaccounts_attributes"=>{"0"=>{"iban"=>"13123123", "swift"=>"121212", "id"=>"3"}, "1"=>​​{"iban"= >"33333", "swift"=>"33333", "id"=>"9"}, "2"=>{"iban"=>"121212", "swift"=>"211212", "id "=>"10"}}}, "commit"=>"TALLENNA", "action"=>"update", "controller"=>"producers", "id"=>"54"}

应该多包含一条bankaccount_attributes 记录,但只包含非动态添加的记录。

我已经摸索了好几个小时了,所以任何帮助都将不胜感激。

如果问题形成不好也很抱歉,这是我的第一个:)

【问题讨论】:

  • 您能否包含您的 link_to_add_association 方法以及将字段插入表单的代码?当插入一个新的输入字段时,如果你在浏览器中检查它,它的元素 id 是什么?
  • 应该指定 link_to_add_association 来自 cocoon gem 的这个特定示例。但是在使用 nested_forms gem 或 railscasts #196 嵌套模型示例时,同样的问题仍然存在。添加了浏览器源代码视图的屏幕截图。
  • 这看起来可以将值下载到服务器。如果您使用调试器 gem 并临时在控制器操作中添加 debugger 语句,则可以检查是否正在传递参数。当您到达断点时,您可以查看params[:producer][:bankaccounts_attributes] 中的内容。如果那里出现了正确的值,请查看下面@Rich Peck 的建议。
  • 添加了调试器的输出。看来参数并没有像我原先想的那样提交到服务器。
  • 当你的 JavaScript 插入新的输入字段时,它们是包含在
    元素内还是在它之外?

标签: ruby-on-rails nested-forms


【解决方案1】:

我发现了我的应用程序的问题,如果不知道是否有人觉得这不再有用。

我猜你已经在 HTML 表格中编写了你的​​ form_for(这就是我所做的)。如果是这样,浏览器会生成不一致的 DOM。如果您动态生成表单输入,除非您通过表单选择器选择它,否则它不会将其放入表单中。所以解决办法就是把表单放到HTML表格之外。

【讨论】:

  • 我也用 rails 遇到过这个问题。我在上面浪费了大约 5 个多小时。我使用 jQuery 进行 DOM 操作 - 所以我不得不说这是一个 jQuery 问题,而不是浏览器或 rails。
【解决方案2】:

你的强大参数和控制器是什么样的?

嵌套属性应该是这样的:

def params
    params.require(:form_for_variable).permit(bankaccounts_attributes: [:iban, :swift])
end

此外,您需要在将表单提交到的模型中包含 accepts_nested_attributes_for :bankaccounts

【讨论】:

  • 您可能还需要包含:id,否则当您打算更新现有记录时它可以创建新记录:params.require(:producer).permit(bankaccounts_attributes: [:id, :iban, :swift])
  • 嵌套参数都很好,甚至还有 :id 。 :) 如果我使用静态字段提交,则表单可以正常工作。这里的问题是动态创建的字段的内容不会被提交给服务器。
  • 我猜这个“包含 :id”是这个问题的真正答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多