2009-05-05 92 views
6

Tôi đã triển khai một số giao diện tương tác đẹp có thể sắp xếp danh sách trong ứng dụng đường ray m của tôi cho các kiểu sử dụng acts_as_list. Tôi có một hàm sắp xếp được gọi và đặt vị trí cho mỗi bản ghi sau mỗi lần kéo và thả bằng hàm sortable_element script.aculo.us.Cách tạo giao diện có thể sắp xếp với 'các hành vi như lồng nhau' trong RubyOnRails

Đây là một ví dụ về các hành động điều khiển để xử lý các loại sau khi kéo và thả hoàn thành:

def sort 
    params[:documents].each_with_index do |id, index| 
     Document.update_all(['position=?', index+1], ['id=?', id]) 
    end 
    end 

Bây giờ tôi đang cố gắng để làm điều này cùng với một mô hình mà là một tập hợp lồng nhau (acts_as_nested_set) . Ví dụ về loại tương tác giao diện: http://script.aculo.us/playground/test/functional/sortable_tree_test.html

Tôi bị kẹt về cách viết hành động của bộ điều khiển để xử lý sắp xếp khi kéo và thả hoàn tất.

Tôi đã thêm tham số: tree => true vào hàm _element sắp xếp cho đến nay xuất hiện để gửi danh sách băm nhưng có vẻ như tôi vẫn thiếu thông tin về toàn bộ thứ tự lồng nhau ....

Tôi đã chắc chắn điều này đã được thực hiện trước và không muốn cố gắng phát minh lại bánh xe, nhưng tôi dường như không tìm thấy bất kỳ ví dụ nào về thao tác điều khiển < -> xem với thiết lập chức năng js để xử lý một loại có thể sắp xếp acts_as_nested_set

Bất kỳ trợ giúp nào khi tạo tập hợp lồng nhau có thể sắp xếp tương tác trong rubyonrails sẽ được đánh giá cao!

Cảm ơn,

John

+0

Sử dụng plugin bộ lồng nhau tuyệt vời trong trường hợp ai đó quan tâm đến việc trợ giúp ... về cơ bản kéo dài _set lồng nhau ban đầu – Streamline

+0

Tôi cần chính xác điều tương tự được tạo bằng jQuery. Lên bầu bạn dù sao đi nữa. –

+0

Có các cách tích hợp để khớp với thứ tự được chuyển từ hàm băm param đến toàn bộ tập hợp lồng nhau của tất cả các mục trong mô hình không? – Streamline

Trả lời

1

Chỉ cần thấy câu này:

sortable_element_for_nested_set trên github

Hình như nó sẽ thực hiện công việc, tuy nhiên tôi đang gặp một số lỗi trong khi cố gắng để thực hiện nó. Về cơ bản nó làm cho javascript trả về id của phần tử đã được di chuyển, sau đó đi qua các phần tử và trả về giá trị mới của nó, giá trị trái và phải. Không thể tin rằng nó được thực hiện lâu dài cho một cái gì đó như thế này để được viết! Lucky đó chỉ là khi tôi cần nó :)

2

xem ví dụ ứng dụng ở đây - http://github.com/matenia/jQuery-Awesome-Nested-Set-Drag-and-Drop

Đó là một cách hacky để làm việc đó, nhưng nó về cơ bản, sắp xếp đầu tiên, sau đó lưu trật tự. Sử dụng nestedsortables, serializelist và 2 hành động để đi qua cây

PS: Tôi biết câu hỏi này đã hơn một tuổi nhưng hy vọng rằng liên kết ở trên sẽ giúp người khác đến đây.

chỉnh sửa: thêm ví dụ Rails3 với một số mã hơi rõ ràng hơn.

+0

Dự án này chưa được cập nhật trong 5 năm BTW. – fatfrog

2

một giải pháp tốt với ONE sql truy vấn từ http://henrik.nyh.se/2008/11/rails-jquery-sortables

# in your model: 

def self.order(ids) 
    update_all(
    ['ordinal = FIND_IN_SET(id, ?)', ids.join(',')], 
    { :id => ids } 
) 
end 
+0

Tôi nghĩ rằng điều này chỉ làm việc cho các danh sách, không phải tập hợp lồng nhau. Mặt khác, đó là một giải pháp duy nhất của MySQL. – calas

1

Dưới đây là một đoạn mã từ dự án của tôi mà không được lừa:

http://gist.github.com/659532

def reorder_children(ordered_ids) 
    ordered_ids = ordered_ids.map(&:to_i) 
    current_ids = children.map(&:id) 
    unless current_ids - ordered_ids == [] && ordered_ids - current_ids == [] 
     raise ArgumentError, "Not ordering the same ids that I have as children. My children: #{current_ids.join(", ")}. Your list: #{ordered_ids.join(", ")}. Difference: #{(current_ids - ordered_ids).join(', ')}/#{(ordered_ids - current_ids).join(', ')}" 
    end 
    j = 0 
    transaction do 
     for new_id in ordered_ids 
     old_id = current_ids[j] 
     if new_id == old_id 
      j += 1 
     else 
      Category.find(new_id).move_to_left_of(old_id) 
      current_ids.delete(new_id) 
     end 
     end 
    end 
    end 

Bạn gọi nó trên cha mẹ, và nó sẽ sắp xếp các trẻ em.

Bạn chỉ cần vượt qua trong các giá trị mà bạn nhận được từ Sortable, như vậy:

def reorder 
    @category.reorder_children(params[:categories]) 
    render :nothing => true 
    end 

Hope this helps.

// Lars

0

the_sortable_tree

Sortable Nested Set cho Rails 3.1+

Dreaming về Kéo và thả cho Sets lồng nhau? Nó nên được với JQuery? Đây là giải pháp!