サブクラスを持つActiveRecordがあり、そのサブクラスは別のActiveRecordオブジェクトに関連付けられています。ネストされた属性を持つオブジェクトを、ネストされた属性を持つフォームで新しいオブジェクトに問題なく作成することができます(Ryan Bates Railsキャストに続いて-ちなみにありがとう:))。ただし、更新を行うと、送信時にメインオブジェクトまたは関連オブジェクトのいずれかに変更を保存できません。
次のActiverecordクラスとサブクラスがあります。
class Room < ActiveRecord::Base
attr_accessible :name, :type, room_headers_attributes
has_many :room_headers, dependent: :destroy
accepts_nested_attributes_for :room_headers , :allow_destroy => true
end
そしてサブクラスは
class BigRoom < Room
end
そして、関連するクラスは
class RoomHeader < ActiveRecord::Base
attr_accessible :key, :room_id, :value
belongs_to :room
end
ルームコントローラーで、ネストされたオブジェクトを作成しました。サブクラスタイプを指定するために:typeを使用していることに注意してください
def new
@room = current_user.passes.build(params[:room])
@room.type = params[:type]
3.times do
room_header = @room.room_headers.build
end
....
end
....
def edit
@room = Room.find(params[:id])
end
def update
@room = Room.find(params[:id])
if @room.update_attributes(params[:room])
...
作成と編集に使用されるフォームは同じです
<%= form_for(@room) do |f| %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<%= f.fields_for :room_headers do |builder| %>
<%= render 'room_header_fields', f: builder %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end &>
そして、_room_headers.html.erbパーシャルは
<p class="fields">
<%= f.label :key, "Key" %>
<%= f.text_field :key %>
<%= f.label :value, "Value" %>
<%= f.text_field :value %>
<%= f.check_box :_destroy %>
<%= f.label :_destroy, "Remove Header" %>
</p>
問題を要約します。新しいBigRoomを正常に作成できます。新しいフォームでは、BigRoomを作成すると、RoomHeaderクラスの値を正常に設定でき、これらはすべて正常に保存されます。
ただし、レコードを編集して更新のために変更を送信すると、何も保存されません。Bigroom属性または関連するRoomHeaderレコードの変更。