我正在尝试使用scriptaculous辅助方法sortable_element在我的Rails应用程序中实现拖放可排序列表。虽然视图的代码看起来很简单,但我真的不太清楚在控制器中写什么来更新“位置”列。
以下是我的观点,“_ show_related_pgs.erb”:
<ul id = "interest_<%=@related_interest.id.to_s%>_siblings_list">
<%= render :partial => "/interests/peer_group_map", :collection => @maps, :as => :related_pg %>
</ul>
<%= sortable_element("interest_"+@related_interest.id.to_s+"_siblings_list", :url => {:action => :resort_related_pgs}, :handle => "drag" ) %>
<br/>
这是部分相关的行,“interest / peer_group_map.erb”
<li class = "interest_<%=@related_interest.id.to_s%>_siblings_list"
id = "interest_<%=related_pg.interest_id.to_s%>_siblings_list_<%=related_pg.id.to_s%>">
Scriptaculous UI魔法适用于这些,但我不确定如何更改数据库中的“位置”列以反映这一点。我是否应该将集合@maps传递回控制器并告诉它迭代它并增加/减少每个属性“position”?如果是这样,我如何判断哪个项目已向上移动,哪个项目向下移动?在生成的html中,我无法使用Chrome开发工具找到任何具体内容。
每个重排后,我还需要重新呈现收集@maps因为位置被打印出来,旁边的每个感兴趣的名称(我使用它作为我的电话给sortable_element(以下简称“处理”规定)) - 虽然这应该是微不足道的。
有什么想法?
谢谢, -e
答案 0 :(得分: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。