Ryan Bates のチュートリアル ( Episode 196 - Nested Model Forms (Revised) )に従ってEmployee
、ネストされたモデル ( ) を持つhas_many :through
モデル( ) のフォームを作成しましたCapability
。ほとんどの場合、それは機能します。しかし、リンクをクリックして新しいモデル オブジェクトをフォームに追加すると、2 つのオブジェクトが作成されて挿入されます。理由はわかりません - 私はこれに数晩苦労しましたが、うまくいきません. 誰かが私が間違っている場所を指摘できますか?
(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 パーシャル
<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','
')})
end
jQuery コーヒースクリプト
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()