Rails 3嵌套模型表单创建重复的模型对象

时间:2012-06-12 06:41:42

标签: jquery ruby-on-rails-3 nested-forms

我跟随Ryan Bates的教程(Episode 196 - Nested Model Forms (Revised))为模型(Employee)创建了一个带有嵌套has_many :through模型(Capability)的表单。在大多数情况下它起作用;但是,当我单击链接以向表单添加新模型对象时,将创建并插入 two 。我不知道为什么 - 我现在已经为这几天晚上挣扎了,只是无法解决这个问题。谁能指出我出错的地方?

Capability此处代表has_many through关联:Employee has_many :roles, through: :capabilities)。

形成部分

<%= form_for(@employee) do |f| %>

  # Employee fields here ...

  <%= f.fields_for :capabilities do |builder| %>
    <%= render 'capability_fields', f: builder %>
  <% end %>
  <%= link_to_add_fields "Add capability", f, :capabilities %>

  <%= f.submit "Submit", :class => 'submit' %>
<% end %>

capability_fields partial

<fieldset>
  <%= f.select :role_id, Role.all.collect{ |r| [r.name, r.id]} %>
  <%= f.check_box :primary_role_flag %>
  <%= f.text_field( :valid_from, :class => 'date') %>
  <%= f.text_field( :expires_on, :class => 'date') %>
  <%= f.hidden_field :_destroy %>
  <%= link_to "Remove", '#', class: "remove_fields" %>
</fieldset>

link_to_add_fields应用程序助手

def link_to_add_fields(name, f, association)
  new_object = f.object.send(association).klass.new
  id = new_object.object_id
  fields = f.fields_for(association, new_object, child_index: id) do |builder|
    render(association.to_s.singularize + "_fields", f: builder)
  end
  link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub('\n','&#xA')})
end

jQuery coffeescript

jQuery ->
  $('form').on 'click', '.remove_fields', (event) ->
    $(this).prev('input[type=hidden]').val('1')
    $(this).closest('fieldset').hide()
    event.preventDefault()

  $('form').on 'click', '.add_fields', (event) ->
    time = new Date().getTime()
    regexp = new RegExp($(this).data('id'), 'g')
    $(this).before($(this).data('fields').replace(regexp, time))
    event.preventDefault()

1 个答案:

答案 0 :(得分:0)

这可能没有帮助,但在我看来,问题可以追溯到Decent Exposure宝石。

编辑:好的,看起来这是我的错,而不是体面曝光。我使用以下方法明确设置属性:

gallery.attributes = params[:gallery]

我这样做是因为我需要在保存记录之前检查权限。事实证明,Decent Exposure已经为我做了这件事。因此,造成重复。我知道这可能无法解决您的问题,但我所要做的就是从我的控制器中删除该行,一切正常。

我希望至少能给你一些关于要看什么的想法。