2008-10-14 45 views
15

Tôi nghĩ rằng điều quan trọng để có một "undo" phương pháp ala gmail khi phá hủy các hồ sơ thay vì hiển thị một popup gây phiền nhiễu mà nói, "Bạn có chắc chắn?".Cách tốt nhất để triển khai kiểu gmail "hoàn tác" trong Rails là gì?

Cách mà tôi đã thực hiện điều này là phải có một "deleted_at" cột timestamp trong mô hình mà được timestamped khi phá hủy phương pháp được gọi là

def destroy 
    @foo = Foo.find(params[:id]) 
    @foo.update_attribute(:deleted_at, Time.now) 
    ... 
end 

Để Revert/undo tôi sẽ chỉ cần đặt cùng một cột cho nil

def revert 
    @foo = Foo.find(params[:id]) 
    @foo.update_attribute(:deleted_at, nil) 
    ... 
end 

Tôi sẽ chỉ cần thêm điều kiện để loại bỏ các lỗi "đã xóa" khi tôi gọi phương thức tìm. Có lẽ thiết lập một cron hoặc nền nhiệm vụ để thực sự tiêu diệt "xóa" foos sau một thời gian.

Làm việc cho tôi và dễ thực hiện nhưng tôi tò mò muốn có cách nào tốt hơn để triển khai tính năng này? Có thể có một plugin hoặc đá quý cung cấp cái này mà tôi không biết?

+0

Bạn có thực sự quan tâm khi nó đã bị xóa không? Không phải là một lá cờ đủ? –

+4

Vâng tôi không thực sự quan tâm khi nó đã bị xóa cho bây giờ nhưng kiến ​​thức đó có thể hữu ích xuống dòng. Dù sao tôi nghĩ rằng dấu thời gian làm cho một lá cờ tốt. – JasonOng

+1

Tôi đồng ý với tình cảm chung.Tuy nhiên, một vấn đề có thể xảy ra bởi nhu cầu làm trống trước như vậy là nó có thể lừa các nhà phát triển khác tìm kiếm thông tin (timestamp) hiện đang được sử dụng ở đâu. Khi nó không thực sự được sử dụng ở đâu đó, nó đại diện cho một chủ đề lỏng lẻo, thường gây khó chịu và tốn thời gian cho người không được khởi xướng. – Magne

Trả lời

4

Có một số plugin thực sự có thể được tìm thấy tại Agile Web Development.

Dưới đây là các liên kết và tóm tắt cho các plugin có vẻ phù hợp mô tả của bạn:

  1. Acts as Paranoid: "hoang tưởng" Hãy ghi Active Xóa chúng không xóa hàng, nhưng thiết lập một trường deleted_at. Tìm bị quá tải để bỏ qua các bản ghi đã xóa.
  2. Acts as soft deletable: Cung cấp khả năng xóa mềm các mô hình ActiveRecord.
+0

Có vẻ như Hành vi Như Paranoid có thể có một số vấn đề với các phiên bản tương lai của ActiveRecord vì nó ghi đè phương thức tìm kiếm. Hành vi mềm xóa có vẻ tốt. Tôi chỉ tự hỏi nếu delete_table được ra khỏi đồng bộ làm thế nào để tôi resync nó? Trước đây bạn đã sử dụng bất kỳ thiết bị nào chưa? – JasonOng

+0

Không, nhưng trong phần mô tả của xóa mềm nó nói rằng nó có phương pháp trợ giúp được xây dựng để giữ chúng đồng bộ – Tilendor

+0

Một đánh giá ngắn gọn của hai làm cho nó có vẻ như Hành vi như mềm xóa được sẽ là lựa chọn tốt hơn, cả hai cho phương pháp được sử dụng và thực tế là nó dường như được duy trì tốt hơn. –

0

Có một tập tin here mà dường như để làm những gì bạn đang cần, nhưng cá nhân tôi nghĩ rằng phải có một cái gì đó ra khỏi đó mà tự động lọc ra các hồ sơ xóa trừ khi bạn đặc biệt bao gồm chúng. Bằng cách đó, chúng thực sự sẽ xuất hiện đã bị xóa trừ khi bạn đưa vào một tham số hoặc một phạm vi được đặt tên bao gồm chúng.

Thật không may, tôi đã không viết một và thời gian rảnh rỗi bị hạn chế, nhưng nó không phải là khó, phải không?

-1

mô hình chuỗi trách nhiệm

class Action 
{ 
    Perform(context); 
    Undo(context); 
} 
+2

Điều này rất mơ hồ và không cho tôi biết bất kỳ ý tưởng nào về cách thực sự hoàn tác. ngữ cảnh là gì? nó tương tác với cơ sở dữ liệu như thế nào? – Tilendor

0

Bạn có thể di chuyển các mục đã xóa thành một bộ sưu tập riêng biệt (hoặc bảng, hoặc bất cứ điều gì) - sau đó bất cứ điều gì mà sẽ tìm trong danh sách ban đầu sẽ thấy rằng nó bị xóa, và bạn có thể đối phó với danh sách mới khi nó thuận tiện.

0

PaperTrail thực hiện điều này một cách độc đáo. Có một tốt Railscast trên đó, mặc dù nó là một chút cũ bây giờ. Tôi biết câu hỏi này đã được hỏi khá lâu trước đây nhưng tôi tình cờ hiểu được sự tò mò và nghĩ rằng tôi nên tham khảo một cách tốt nhất để làm điều này.

Các vấn đề liên quan