可以拖放的排序列表
实现一个可以,可以排序的列表,可以假设为:我们有一个需要播放的视频列表。如果,你想显示这些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]