Rails 3 Cocoon link_to_add_association渲染部分两次

时间:2013-01-23 14:24:37

标签: ruby-on-rails-3 nested-attributes cocoon-gem

我的部分被渲染两次,而不是只按预期渲染一次。有什么想法吗?

这是我的人物视图

<%= simple_nested_form_for(@person) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">

    <%= f.input :name %>

    <h3>Records by year</h3>

    <div id='records'>
      <%= f.simple_fields_for :records do |record| %>
        <%= render 'record_fields', :f => record %>
      <% end %>

      <div class='links'>
        <%= link_to_add_association 'New Record', f, :records, :class => 'btn' %>
      </div>
    </div>

  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

模型(删除了诸如常量和验证之类的东西):

class Person < ActiveRecord::Base

    attr_accessible :name, :records_attributes

    has_many :records, :dependent => :destroy
    accepts_nested_attributes_for :records, :reject_if => :all_blank, :allow_destroy => true

end

class Record < ActiveRecord::Base

    attr_accessible :price, :status, :year, :person_id

    belongs_to :person
end

我的_record_fields.html.erb部分看起来像这样:

<div class='nested-fields well'>
    <%= f.input :price %>

    <%= f.input :year %>

    <%= f.input :status, :collection => record_statuses, :include_blank => false %>

    <%= link_to_remove_association "Remove", f %>
</div>

一个有趣的问题是,如果我改变部分生成的位置(在'之后'而不是在link_to_add_association链接之前的'默认'之后),它会在按钮之后生成部分,但是在link_to_add_association之前生成副本链接。

我在这里报告的唯一类似问题是生产中的缓存。这是在开发中发生的,我的缓存被关闭(默认情况下)。

我错过了什么吗?有人可以帮忙吗?

修改 看看茧的JavaScript,似乎点击事件被一次点击两次(用$('。add_fields')测试。单击(),触发$('。add_fields')。live('click',function (){...})两次。我仍然不知道为什么会发生这种情况。输入完全​​赞赏。

编辑#2:

控制器:

  # GET /persons/new
  # GET /persons/new.json
  def new
    @person = Person.new
    # @person.records.build

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @person }
    end
  end

  # GET /persons/1/edit
  def edit
    @person = Person.find(params[:id])
  end

3 个答案:

答案 0 :(得分:15)

我遇到了同样的问题。 我的问题是我需要两次茧javascript。

进入我的application.js

// app/assets/javascripts/application.js
//= require cocoon

一次在我的应用程序布局中

/ app/views/layouts/application.html.haml
= javascript_include_tag :cocoon

从我的布局中删除include标签后,它开始按预期工作

答案 1 :(得分:1)

有同样的问题,发现我的应用程序布局(app / views / layouts / application.html.erb)中已经包含了application,而在application.js中我也包含了茧。在我认为与茧一起使用application.js时,茧会开火两次。

(与上述相同,但略有不同,因为我没有在application.html.erb中明确指定茧,而是指定了包含茧的application.js)

答案 2 :(得分:0)

这发生在从 application.js 中时,您需要两次 cocoon,通常,当您尝试将 jQuery 更改为 vanilla Javascript 时