【问题标题】:Rails 3.1 cocoon gem for nested forms用于嵌套表单的 Rails 3.1 茧宝石
【发布时间】:2026-02-20 00:00:01
【问题描述】:

我实际上正在尝试 cocoon gem(由 nathanvda 提供)和 simple_form gem 来动态添加和删除表单上的字段。我不明白为什么嵌套表单没有出现在我的表单上。这是代码。 (我当然是新手)。请我帮忙。

menu/_form.html.erb

     <%= f.input :name %>
    <%= f.input :price %>

   <%= f.simple_fields_for :drinks do |drink| %>
       =render "drink_fields", :f => drink.links %> 
      <%= link_to_add_association "Add drink"%>
     <%end%> 

     <%= f.button :submit %> 
        <%end%>

菜单/_drink_fields.html.erb

.nested-fields

这些是模型

class Drinks < ActiveRecord::Base
    belongs_to :menu
end

class Menu < ActiveRecord::Base
    attr_accessible :drinks_attributes  

  has_many :drinks, :dependent => :destroy

  accepts_nested_attributes_for :drinks

end

在 assets/javascripts/application.js 中

//= require cocoon

在 layouts/application.html.erb

<%= javascript_include_tag :cocoon %> 

【问题讨论】:

    标签: ruby-on-rails forms gem nested cocoon-gem


    【解决方案1】:

    你的嵌套形式是错误的,你混合了haml和erb。如果你还没有个人喜好,我会推荐使用haml,我觉得它比erb 更容易和更干净。

    除此之外,您的menu/_drink_fields.html.erb 应该如下所示:

    <div class='nested-fields'> 
      <%= f.input :name %> 
      <%= link_to_remove_association "remove drink", f %>
    </div>
    

    另外,在您的menu/_form.html.erb 中,您应该写下以下内容:

    <%= f.simple_fields_for :drinks do |drink| %>
       <%= render "drink_fields", f: drink %> 
    <% end %>
    <%= link_to_add_association "Add drink", f, :drinks %>
    

    希望这会有所帮助。

    【讨论】:

    • 我已经更改了代码,但问题在菜单/_form.html.erb 上几乎保持不变我看到“添加饮料”链接。但是当我按下它时,任何事情都没有发生。我真的不明白什么不起作用(ps:我想用html.erb解决问题,而不是切换到haml)
    • 你在用jquery吗?您可以在浏览器控制台中检查您遇到的 javascript 错误吗?
    • 我会继续寻找 cocoon 在我的项目中不起作用的原因。但目前我只想提高生产力并在学习轨道上取得进步。感谢您对 nathanvda 的支持。
    • 我同意 haml 比 erb 更好,但是你如何在 haml 中进行内联 sn-ps?
    • @gwho 为此提出一个单独的问题,并举个例子:)
    【解决方案2】:

    感谢 nathanvda 的提醒。我终于找到了处理嵌套字段的 gem,这是链接:https://github.com/lailsonbm/awesome_nested_fields

    【讨论】:

    • 这看起来真的很棒,虽然我不认为他们打算让它与 rails 4 兼容,而且我想在某个时候将我的应用程序迁移到 rails 4。你有没有发现任何在 rails 4 上运行良好的东西?