我使用插件Kaminari进行分页。我正在Ajaxifing我的应用程序,我遇到了一个问题。我有一个带有分页数据的表单以及用于过滤数据的表单(都是通过Ajax)。开始分页时效果很好,特定页面的网址是'/ admin / rooms?page = X'。在ajax过滤了那些url对'/ admin / rooms / filter?page = X'的更改。 我可以指定在分页时触发的操作:
<%= paginate @rooms, :params => {:controller => 'rooms', :action => 'index'}, :remote => true %>
但随后变量@rooms在索引中重置,我再次对未过滤的数据进行分页。
任何想法我该如何解决?
这是一些代码
rooms_controller.rb :
class Admin::RoomsController < AdminController
def index
@rooms = Room.all
@rooms = Kaminari.paginate_array(@rooms).page(params[:page]).per(5)
@filter_values = [['Room number', 'room_number'], ['Person count', 'person_count'], ['Room class', 'room_class']]
end
def filter
case params[:filter_by]
when 'room_number'
@rooms = Room.find(:all, :conditions => ["CAST(room_number AS VARCHAR) LIKE ?", "#{params[:filter_value]}%"])
when 'person_count'
@rooms = Room.find(:all, :conditions => ["person_count LIKE ?", "#{params[:filter_value]}%"])
else
@rooms = Room.joins(:room_class).where("lower(class_name) LIKE '#{params[:filter_value]}%'")
end
@rooms = Kaminari.paginate_array(@rooms).page(params[:page]).per(5)
respond_to do |format|
format.html { redirect_to admin_rooms_path }
format.js
end
end
index.html.erb :
<%= label_tag 'Filter: ' %>
<%= form_tag(filter_admin_rooms_path, :remote => true) do %>
<%= select_tag :filter_by, options_for_select(@filter_values) %>
<%= text_field_tag :filter_value %>
<%= submit_tag 'Filter', :disable_with => 'Filtering..' %>
<% end %>
...
<div id="rooms_list">
<%= render 'admin/rooms/shared/rooms_list' %>
</div>
_rooms_list.html.erb :
<div id="paginator">
<%= paginate @rooms, :remote => true %>
</div>
<table class="table_listing" style="width: 60%">
...
</table>
答案 0 :(得分:3)
通过再次将参数传递给索引并强制paginate路由到'rooms #index'而不是当前页面(不是Ajax的可见原因)来解决问题。
<强> _rooms_list.html.erb 强>:
<%= paginate @rooms, :params => {:controller => 'rooms', :action => 'index'}, :remote => true %>
参数通过GET从当前的params变量传递给索引。
<强> rooms_controller.rb 强>:
def index
if params[:filter_value].nil?
@rooms = Room.all
else
@rooms = test_filter(params[:filter_value])
end
@rooms = Kaminari.paginate_array(@rooms).page(params[:page]).per(5)
@errors = flash[:errors] || []
@filter_values = [['Room number', 'room_number'], ['Person count', 'person_count'], ['Room class', 'room_class']]
end
def filter
case params[:filter_by]
when 'room_number'
@rooms = Room.find(:all, :conditions => ["CAST(room_number AS VARCHAR) LIKE ?", "#{params[:filter_value]}%"])
when 'person_count'
@rooms = Room.find(:all, :conditions => ["person_count LIKE ?", "#{params[:filter_value]}%"])
else
@rooms = Room.joins(:room_class).where("lower(class_name) LIKE '#{params[:filter_value]}%'")
end
@rooms = Kaminari.paginate_array(@rooms).page(params[:page]).per(5)
params[:authenticity_token] = nil
params[:commit] = nil
respond_to do |format|
format.html { redirect_to admin_rooms_path }
format.js
end
end
def test_filter(val)
rooms = Room.find(:all, :conditions => ["CAST(room_number AS VARCHAR) LIKE ?", "#{val}%"])
rooms
end
test_filter当然要删除/重命名。我认为在参与分页时,我认为不应该将参数传递给下一页的参数。