0

サブクラスを持つ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レコードの変更。

4

2 に答える 2

0

最初に試してみてください

  if @room.update_attribute(params[:room])

     rather
   if @room.update_attributes(params[:room])

これが機能する場合、それらは検証に関するいくつかのエラーです

于 2012-10-18T10:15:42.567 に答える
0

わかりました、ネストされた属性はニシンでした。問題は性病です

Rails フォーム ヘルパー ガイドには、STI によるレコード識別に頼ることはできないと書かれています。

form_for では、ID を強制的にベース タイプ ID にする必要があります。そうしないと、編集が失敗します

それで

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

する必要があります

<%= form_for(@room.becomes(Room) do |f| %>

html出力の違いを見ると

問題の html は、編集モードで .becomes を使用すると、big_room_fieldname のような ID を作成し、room_fieldname のような ID を取得します。その場合、保存して更新しても問題ありません

于 2012-10-26T10:42:19.137 に答える