2012-10-18 101 views
0

我有ActiveRecord與一個子類及其與另一個ActiveRecord對象關聯。 我能夠創建我的對象具有嵌套屬性的嵌套屬性沒有問題的新對象(以下瑞安貝茨鐵軌投 - 謝謝你的方式:))。但是,當我做更新它無法保存更改主要對象或提交時相關對象當嵌套對象是ActiveRecord子類時,嵌套屬性更新失敗

我有以下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 

在我的房間控制器我創建的嵌套對象。請注意,我用:類型指定用於創建和編輯的子類型

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記錄。

回答

0

好吧,嵌套的屬性,是一個紅色的鯡魚。問題出在STI

Rails表單助手指南說,你不能依靠STI的記錄識別。

在我們需要coearce的ID爲基本類型的id的form_for否則編輯失敗

所以

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

應該

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

,如果你看差在html輸出中

問題html會創建像big_room_fieldname這樣的id當處於編輯模式 使用.becomes時,我們得到ID像room_fieldname。在這種情況下,它節省和更新好吧

0

第一次嘗試通過

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

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

,如果這個工程那麼他們的一些誤區與validdations

+0

我不知道我明白你在暗示我做什麼? –

+0

update_attribute不驗證它只是保存它的記錄,而update_attributes首先驗證然後保存。所以我問你檢查是否由於驗證不保存 –

+0

我現在得到'錯誤數量的參數(1爲2)' –