2

私はこれを理解しようとして頭を叩いています。私は次のフォームを持っています

  <%= bootstrap_form_for @template do |f| %>
     <%= f.text_field :prompt, :class => :span6, :placeholder => "Which one is running?", :autocomplete => :off %>
     <%= f.select 'group_id', options_from_collection_for_select(@groups, 'id', 'name') %>
     <% 4.times do |num| %>
        <%= f.fields_for :template_assignments do |builder| %>
            <%= builder.hidden_field :choice_id %>
            <%= builder.check_box :correct %>
        <% end %>
      <% end %>
   <% end %>

それから私は私のモデルを持っています:

  class Template < ActiveRecord::Base
   belongs_to :group
   has_many :template_assignments
   has_many :choices, :through => :template_assignments
   accepts_nested_attributes_for :template_assignments, :reject_if => lambda { |a| a[:choice_id].blank? }, allow_destroy: true
  end

フォームが送信されると、ネストされた属性が美しく追加されます。ただし、テンプレートを削除する場合は、すべての子「template_assignments」も削除する必要があります。これは、「allow_destroy => true」と想定したものです。

だから、私はRailsコンソールからこれを試しています(これは私の問題でしょうか??) 私は次のようにします:

 >> t = Template.find(1)
 #Which then finds the correct template, and I can even type: 
 >> t.template_assignments
 #Which then displays the nested attributes no problem, but then I try: 
 >> t.destroy
 #And it only destroys the main parent, and none of those nested columns in the TemplateAssignment Model.

ここで私が間違っていることはありますか?Railsコンソールでできないからですか?代わりにフォームで行う必要がありますか? もしそうなら、どうすればフォームでこれを達成できますか?

どんな助けでも素晴らしいでしょう!

4

1 に答える 1

6

template_assignments親の破棄時に子を破棄する必要があることを指定しTemplateます。

# app/models/template.rb
has_many :template_assignments, dependent: :destroy

以下は、Rails がオブジェクトの依存関係を破棄するために実行する手順を示しています。

# from the Rails console
>>  t = Template.find(1)
#=> #<Template id:1>
>>  t.template_assignments.first
#=> #<TemplateAssignment id:1>
>>  t.destroy
#=> SELECT "template_assignments".* FROM "template_assignments" WHERE "template_assignments"."template_id" = 1
#=> DELETE FROM "template_assignments" WHERE "template_assignments"."id" = ?  [["id", 1]]
>>  TemplateAssignment.find(1)
#=> ActiveRecord::RecordNotFound: Couldn't find TemplateAssignment with id=1

オプションは関連付けの:dependentどちらの側でも指定できるため、親ではなく子関連付けで宣言することもできます。

# app/models/template_assignment.rb
belongs_to :template, dependent: :destroy

Railsのドキュメントから:

has_many、has_one、beels_to 関連付けは :dependent オプションをサポートします。これにより、所有者が削除されたときに関連付けられたレコードを削除するように指定できます。

于 2013-09-24T21:24:27.437 に答える