2

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','&#xA')})
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()
4

1 に答える 1

0

これは役に立たないかもしれませんが、私の場合、問題はDecent Exposure gemにまで遡ることができるようです。

編集:わかりました、これは私のせいで、Decent Exposure ではないようです。以下を使用して属性を明示的に設定していました。

gallery.attributes = params[:gallery]

レコードを保存する前に権限を確認する必要があるため、これを行います。Decent Exposure がすでに私のためにこれを行っていたことがわかっただけです。したがって、重複を引き起こします。これで問題が解決しない可能性があることはわかっていますが、コントローラーからその行を削除するだけで、すべて正常に動作しました。

少なくとも、何を見るべきかについていくつかのアイデアが得られることを願っています。

于 2012-07-24T23:20:57.537 に答える