0

我想在我的Rails應用程序中使用scriptaculous幫助器方法sortable_element實現拖放式可排序列表。雖然視圖的代碼看起來非常簡單,但我真的不確定要在控制器中寫什麼來更新「位置」列。在查找()生成的列表中使用sortable_element()

這是我在我看來已經有了, 「_show_related_pgs.erb」:

<ul id = "interest_<%[email protected]_interest.id.to_s%>_siblings_list"> 
    <%= render :partial => "/interests/peer_group_map", :collection => @maps, :as => :related_pg %> 
</ul> 

<%= sortable_element("interest_"[email protected]_interest.id.to_s+"_siblings_list", :url => {:action => :resort_related_pgs}, :handle => "drag") %> 
<br/> 

下面是從局部的相關行, 「利益/ peer_group_map.erb」

<li class = "interest_<%[email protected]_interest.id.to_s%>_siblings_list" 
     id = "interest_<%=related_pg.interest_id.to_s%>_siblings_list_<%=related_pg.id.to_s%>"> 

Scriptaculous用戶界面魔術效果很好,但我不確定如何更改數據庫中的「位置」列來反映這一點。我應該將集合@maps傳遞迴控制器並告訴它遍歷它並遞增/遞減屬性「position」?如果是這樣,我怎麼知道哪個項目上移了,哪個下移了?我找不到在生成的html中使用Chrome開發工具的具體內容。

每次重新排序後,我還需要重新呈現收集@maps因爲位置被打印出來,旁邊的每個感興趣的名稱(我使用它作爲我的電話「手柄」指定sortable_element ()) - 雖然這應該是微不足道的。

有什麼想法?

感謝, -e

回答

0

我通常會創建在我的控制器中的排序操作,看起來像這樣:

def sort 
    order = params[:my_ordered_set] 
    MyModel.order(order) 
    render :nothing => true 
end 

不要忘記添加路由:

map.resources :my_model, :collection => { :sort => :put } 

現在,爲MyModel我補充一點,有一個查詢更新所有的排序記錄一個類的方法(在MySQL這隻作品,我覺得..):

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

單查詢方法來自Henrik Nyh

+0

謝謝 - 我發現了一個railscast解釋了這個,我修改了一下(給params一個字符串,而不是:this_thing,以保持變量div名稱)。但是這個「立即更新」的東西看起來非常快/有用/很酷,謝謝! – 2010-05-05 08:27:31

+0

你可以發佈那個railscast url嗎? – sethvargo 2011-01-03 07:04:19