夜鸣猪 发表于 2013-1-23 02:42:36

可以拖放的排序列表

实现一个可以,可以排序的列表,可以假设为:我们有一个需要播放的视频列表。如果,你想显示这些Video列表,并且实现拖放。

      那么,首先,你需要添加一个position的字段到Video的model。这应该通过如下的migrate文件实现:
script/generate migration add_position_to_videos position:integer
然后执行 rake db:migrate.


       如果,希望实现拖放,那么必然要用js,所以先检查是不是加载了prototype和scriptaculous,然后,可以看index.html.erb

   <h1>Videos</h1>   <ul id="videos">       <% @videos.each do |video| %>         <% content_tag_for :li, video do %>         <%= link_to video.name, video_path(video) %>         <% end %>       <% end %>   </ul>   <%= link_to "New Video, new_video_path %>

   那么,要实现可排序,那么需要添加sortable_element的helper到index,你还需要传送element的id和一个AJAX请求来更新位置。
   <%= sortable_element('videos', :url => 'sort_videos_path') %>

这样的helper方法,就已经可以实现拖放了,但是新的顺序并没有保存到数据库。这就需要代码来完成逻辑了。

videos_controller.rb
   def sort       params[:videos].each_with_index do |id, index|         Video.update_all([’position=?’, index+1], [’id=?’, id])       end       render :nothing => true   end

这样,我们就应该有了排序逻辑。

   def index       @videos = Video.all(:order => ’position’)   end
然而,我们还应该考虑,路由的问题,才能使用。   map.resources :videos, :collection => { :sort => :post}
这段代码表明,我们的方法是调用POST请求,就是AJAX的XMLHTTP sort

下面,我们还有一些改进的办法,可以采用来表明可以拖动的类 <% content_tag_for :li, video do %>   <span class="handle"></span>   <%= link_to video.name, video_path(video) %>   <% end %>

   <%= sortable_element(’videos’), :url => sort_videos_path, :handle => ’handle’ %>CSS的设置 li .handle { color: #777; cursor: move; font-size: 12px; }

使用插件来实现列表
script/plugin install git://github.com/rails/acts_as_list.git
acts_as_list要添加到model里
   class Video < ActiveRecord::Base       acts_as_list   end
完成了
页: [1]
查看完整版本: 可以拖放的排序列表