2011-08-22 139 views
6

我在show.erb嵌套屬性和我創建一個空白嵌套的屬性,在像這樣的底部顯示與空白項目的網格。添加刪除鏈接,嵌套屬性

<%= form_for @question do |q| %> 
    <% q.fields_for :answers, @question.answers do |l| %> 
    <tr> 

     <td><%= l.text_field :text %></td> 
     <td><%= l.check_box :correct %></td> 
     <td><%= l.text_field :imagename %></td> 
     <td><%= l.number_field :x %></td> 
     <td><%= l.number_field :y %></td> 
    </tr> 
    <% end %> 

    <tr> 
     <td colspan=5 align=right><%= submit_tag '+' %> 
    </tr> 

<% end %> 

我想的link_to「消滅」的工作,但我得到undefined method 'plural'當我加入這給電網

<%= link_to 'Destroy', l, :controller => "answer", :confirm => 'Are you sure?', :method => :delete %> 

回答

21

爲什麼要使用鏈接?您還可以在嵌套屬性中使用銷燬功能。

所有你需要做的就是在你的accepts_nested_attributes定義添加:allow_destroy => true並添加

<%= l.check_box '_destroy' %> 

到每個記錄。 這樣可以在保存記錄時使用複選框刪除所有嵌套記錄。

1

你使用l變量是不正確的。當您從fields_for塊中屈服時,塊對象是FormBuilder的一個實例,而不是該對象本身的一個實例。您希望鏈接指向哪個網址?它是Answers#destroy?你想發送什麼標識到這個動作來確定要銷燬什麼? A link_to不是表單元素。它只是錨標籤的幫手。你需要一個url,而不是一個表單生成器來建立該鏈接。

這是一個答案表的列表嗎?每個答案一個?如果是這樣,你可能想循環使用它們,而不是僅僅使用fields_for

希望這可以幫助你走上正確的軌道。

+0

是的,我是一個白癡不通過模型,而不是表單生成器 –

9

對於那些來自谷歌發現這一點,而技術上刪除複選框可能是正確的做法,我認爲這是令人困惑 - 唯一的好處是,它需要兩次點擊刪除(選擇框和命中更新)。確保刪除清楚發生的情況可能會更好,並可能添加一條簡單的方法將其恢復。

下面是將更新發送到服務器的AJAX,來處理在回調或JS視圖文件更新頁面。刪除遙控器:true,它將作爲常規鏈接工作。

# For my form I build a new object if it's missing, 
# so I need to check that this is not a new nested attribute. 
- unless question.answers.new_record? 
    # Basically, I am sending over the fields that would be sent 
    # by the _delete check box form being updated. 
    = link_to "Delete", question_path(question.id, question: { answers_attributes: { id: question.answers.id, "_destroy" => true }}), remote: true, confirm: "Really delete?", method: :put 
+1

是的,這工作正常has_many關係。 此外,要獲得確認框,您可以添加',data:{confirm:'您確定嗎?' }'方法後:'put' 我注意到的一件事(至少在我的情況下)是該項目被刪除,但頁面沒有自動重新加載。 – 8bithero

+0

感謝has_many的確認(不知道爲什麼它不會工作)。在你的評論中還添加了一些關於確認的註釋,如果你刪除了remote:true,它應該像普通鏈接一樣工作並刷新頁面 - 否則你必須自己處理。 – d3vkit

+0

我同意,UX的刪除複選框非常奇怪 – Dex