2011-08-22 9 views
6

Tôi có thuộc tính lồng nhau trong tệp show.erb và tôi tạo thuộc tính lồng nhau trống và hiển thị lưới các mục có ô trống ở dưới cùng như vậy.Thêm liên kết xóa cho thuộc tính lồng nhau

<%= 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 %> 

Tôi muốn có một link_to 'Tiêu diệt' để làm việc nhưng tôi nhận được undefined method 'plural' khi tôi thêm video này vào lưới

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

Trả lời

21

Tại sao bạn muốn sử dụng liên kết? Bạn cũng có thể sử dụng chức năng hủy trong các thuộc tính lồng nhau.

Tất cả bạn cần làm là thêm :allow_destroy => true trong định nghĩa accepts_nested_attributes của bạn và thêm

<%= l.check_box '_destroy' %> 

để mỗi bản ghi. Bằng cách đó, nó sẽ xóa tất cả các bản ghi lồng nhau bằng hộp kiểm được chọn khi lưu bản ghi.

1

Biến bạn đang sử dụng l là không đúng. Khi bạn thu được từ một khối fields_for khối đối tượng là một thể hiện của FormBuilder không phải là một thể hiện của chính đối tượng đó. Bạn muốn liên kết trỏ đến url nào? Có phải là Answers#destroy không? Bạn muốn gửi id nào cho hành động này để xác định những gì cần hủy? A link_to không phải là phần tử biểu mẫu. Nó chỉ là một người trợ giúp cho một thẻ neo. Bạn cần một url, không phải là trình tạo biểu mẫu để tạo liên kết đó.

Đây có phải là danh sách các mẫu câu trả lời không? Một cho mỗi câu trả lời? Nếu có, bạn có thể muốn lặp qua chúng thay vì chỉ sử dụng fields_for.

Hy vọng điều này giúp bạn đi đúng hướng.

+0

có, tôi là kẻ ngốc vì không chuyển mô hình thay vì trình tạo biểu mẫu –

9

Đối với những người tìm kiếm điều này từ Google, trong khi kỹ thuật hộp kiểm xóa có thể là cách chính xác, tôi nghĩ điều đó gây nhầm lẫn - lợi ích duy nhất là yêu cầu hai lần nhấp để xóa (chọn hộp và nhấn cập nhật). Nó có thể là tốt hơn để chỉ đảm bảo xóa là rõ ràng những gì đang xảy ra, và có thể thêm một cách dễ dàng để làm cho nó trở lại.

Sau đây là gửi bản cập nhật lên máy chủ dưới dạng ajax, để xử lý việc cập nhật trang trong tệp xem lại hoặc xem js. Xóa từ xa: true và nó sẽ hoạt động như một liên kết thông thường.

# 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

Điều này hoạt động tốt trên mối quan hệ has_many. Ngoài ra, để nhận được hộp xác nhận, bạn có thể thêm ', dữ liệu: {xác nhận: 'Bạn chắc chắn?' } 'ngay sau khi' phương pháp:: put' Một điều tôi nhận thấy (ít nhất là trong trường hợp của tôi) là mục đã bị xóa nhưng trang không tải lại tự động. – 8bithero

+0

Cảm ơn bạn đã xác nhận về has_many (không biết tại sao nó không hoạt động). Cũng đã thêm một số ghi chú từ nhận xét của bạn về xác nhận và nếu bạn xóa từ xa: true, nó phải hoạt động giống như liên kết thông thường và làm mới trang - nếu không bạn phải tự mình xử lý. – d3vkit

+0

Tôi đồng ý, UX thực sự kỳ lạ với hộp kiểm xóa – Dex