2012-12-04 46 views
0

我正在最困難的時間才能正確呈現和更新。發生什麼事情是因爲我有一個多對多的關聯,關聯表包含多個屬性。一個案例可以有多個屏幕,一個屏幕多個案例,以及一個案例的屏幕可以針對每個案例進行訂購。另一個與我當前的設置有關的奇怪項目是關聯表在每次提交表單時都沒有清除舊的關聯值。新值將被附加到表中。:has_many,:through =>具有多個屬性的關聯表格更新

類:

class Case < ActiveRecord::Base 
    attr_accessible :cases_screens_attributes 

    has_many :cases_screens 
    has_many :screens, :through => :cases_screens 

    accepts_nested_attributes_for :cases_screens, 
            :allow_destroy => true, 
            :reject_if => lambda { |p| p[:screen_id].nil? } 
end 

class Screen < ActiveRecord::Base 
    has_many :cases_screens 
    has_many :cases, :through => :cases_screens 
end 

class CasesScreen < ActiveRecord::Base 
    attr_accessible :order 

    belongs_to :case 
    belongs_to :screen 
end 

控制器:

# GET /cases/1/edit 
def edit 
    @case = Case.find(params[:id]) 
    @cases_screens = @case.cases_screens.order("cases_screens.[order] ASC") 
    @screens = Screen.where({:active => true}) 
end 

# PUT /cases/1 
# PUT /cases/1.json 
def update 
    @case = Case.find(params[:id]) 
    @cases_screens = @case.cases_screens.order("cases_screens.[order] ASC") 
    @screens = Screen.where({:active => true}) 

    respond_to do |format| 
     if @case.update_attributes(params[:case]) 
     format.html { redirect_to case_path(@case), :notice => t(:case_successfully_updated) } 
     format.json { head :no_content } 
     else 
     format.html { render :action => "edit" } 
     format.json { render :json => @case.errors, :status => :unprocessable_entity } 
     end 
    end 
end 

我在使用fields_for無濟於事嘗試過很多嘗試。這是我目前在我的_form.erb.html文件中。最終目標是,在案例表格中,查看每個屏幕旁邊帶有複選框的所有屏幕列表。每個複選框還有一個關聯的「訂單」輸入。提交後,cases_screens表格將被正確填充(如果不再選擇舊值,則會刪除舊值)。

<div class="controls"> 

    <% @screens.each do |s| %> 

    <label> 
     <%= check_box_tag("case[cases_screens_attributes][#{s.id}][screen_id]", s.id, @case.screen_ids.include?(s.id)) %> 
     <%= s.name %> 
    </label> 
     <%= select_tag("case[cases_screens_attributes][#{s.id}][order]", options_for_select([email protected], 2)) %> 
    <% end %> 

</div> 

我一直在這塊牆上撞了我的頭幾天,我似乎無法做到。任何幫助那裏將不勝感激。

附加說明:

我用簡單的形式,我只是做了以下內容:

<%= f.association :screens %> 

,一切都按預期工作(沒有順序屬性更新)。關聯表被正確清理。當然,這是指向嵌套屬性的方向作爲罪魁禍首,但我不確定。

更新星期三10:45 我現在確信,這裏發生的問題是缺少在窗體中存在cases_screens_id。通常在清理期間,rails會使用這個ID清理以前的條目,然後填充新的條目。由於我正在循環@screens,而不是當前存在的cases_screens(與案例相關),我無法在沒有查詢的情況下通過每行獲取id。

我想現在,我的解決方案將寫一個before_save方法到cases_screens,它將清理當前條目的cases_screens,然後允許新值填充。

更新1:15 我已經接近至少一個項目,因此只有在複選框被選中時纔會插入記錄。我在上面的Case類中添加了更新:reject_if。我仍然沒有解決爲什麼只將值附加到表中,以及爲什麼以前的值不會被刪除。

更新4:00 如果記錄只被設置,我最近的嘗試包括一個隱藏字段,其中包含cases_screens ID。這需要我在循環中創建一個子查詢以獲取當前的cases_screen_id。除了:reject_if參數之外,現在正在更新值。但是,當前的設定值不能再被移除。

我沒有這樣做的權利,它不感覺像鐵軌般。這種情況下,我應該在控制器中手動處理數據嗎?

+0

錯誤...應該不是'cases_screen'是複數,而你用'has_many'使用它?像'has_many:cases_screens'? – scaryguy

+0

我更新了代碼,現在反映了我的模型(包括多元化)。它仍然表現得一樣。 – Venice

回答

0

在這個時候,我正在粉飾這個設計問題。我現在用的

<% @case.cases_screens.each do |cs| %> 
    <%= hidden_field_tag("case[cases_screens_attributes][#{cs.id}][id]", cs.id) %> 
    <%= hidden_field_tag("case[cases_screens_attributes][#{cs.id}][screen_id]", cs.screen_id) %> 
    <%= hidden_field_tag("case[cases_screens_attributes][#{cs.id}][_destroy]", 1) %> 
    <label><%= check_box_tag("case[cases_screens_attributes][#{cs.id}][_destroy]", 0, @case.cases_screen_ids.include?(cs.id)) %> <%= cs.screen.name %></label> 
    <%= text_field_tag("case[cases_screens_attributes][#{cs.id}][ordinality]", cs.ordinality) %> 
    <% end %> 

這隻會導致當前設置的情況下/屏幕linkups露面。用戶需要通過單獨的屏幕將特定的屏幕添加到案例中。

相關問題