Jquery 在Rails中调用Ajax后分页不起作用
我正在使用插件Kaminari进行分页。我正在修改我的应用程序,遇到了一个问题。我有一个带有分页数据的表单,还有一个用于过滤数据的表单(都是通过Ajax)。开始时,分页工作正常,特定页面的url为“/admin/rooms?page=X”。在ajax过滤完这些url对“/admin/rooms/filter?page=X”的更改之后。 我可以通过以下方式指定分页时要触发的操作:Jquery 在Rails中调用Ajax后分页不起作用,jquery,ruby-on-rails,ajax,kaminari,Jquery,Ruby On Rails,Ajax,Kaminari,我正在使用插件Kaminari进行分页。我正在修改我的应用程序,遇到了一个问题。我有一个带有分页数据的表单,还有一个用于过滤数据的表单(都是通过Ajax)。开始时,分页工作正常,特定页面的url为“/admin/rooms?page=X”。在ajax过滤完这些url对“/admin/rooms/filter?page=X”的更改之后。 我可以通过以下方式指定分页时要触发的操作: <%= paginate @rooms, :params => {:controller => 'r
<%= paginate @rooms, :params => {:controller => 'rooms', :action => 'index'}, :remote => true %>
{:controller=>'rooms',:action=>'index'},:remote=>true%>
但随后变量@rooms在索引中被重置,我再次分页未过滤的数据
有什么办法我可以修吗
这里有一些代码
- 房间\u控制器.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
<%= 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>
<div id="paginator"> <%= paginate @rooms, :remote => true %> </div> <table class="table_listing" style="width: 60%"> ... </table>
<%= paginate @rooms, :params => {:controller => 'rooms', :action => 'index'}, :remote => true %>
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
class Admin::RoomsController
[“CAST(Room_number作为VARCHAR)LIKE?”,“#{params[:filter_value]}%]) 当“人员计数”时 @rooms=Room.find(:all,:conditions=>[“person\u count LIKE?”,“{params[:filter\u value]}%]”) 其他的 @rooms=Room.join(:Room_class).where(“较低的(class_name)像'#{params[:filter_value]}%')) 结束 @rooms=Kaminari.paginate_数组(@rooms).page(参数[:page]).per(5) 回应待办事项|格式| format.html{重定向到管理员房间路径} format.js 结束 结束 - index.html.erb:
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
<%= 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>
<div id="paginator"> <%= paginate @rooms, :remote => true %> </div> <table class="table_listing" style="width: 60%"> ... </table>
<%= paginate @rooms, :params => {:controller => 'rooms', :action => 'index'}, :remote => true %>
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
正确)do%> '筛选..'%> ...
- \u rooms\u list.html.erb:
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
<%= 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>
<div id="paginator"> <%= paginate @rooms, :remote => true %> </div> <table class="table_listing" style="width: 60%"> ... </table>
<%= paginate @rooms, :params => {:controller => 'rooms', :action => 'index'}, :remote => true %>
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
正确%> ...
- \u rooms\u list.html.erb:
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
<%= 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>
<div id="paginator"> <%= paginate @rooms, :remote => true %> </div> <table class="table_listing" style="width: 60%"> ... </table>
<%= paginate @rooms, :params => {:controller => 'rooms', :action => 'index'}, :remote => true %>
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
测试过滤器当然要删除/重命名。我没有一些我认为不应该在paginate时在params中传递到下一页的参数。这确实是一个猜测(因此,现在不是答案),但看看您的代码,我假设您必须通过Kaminari的
params
属性为#paginate
视图方法传递过滤器变量。类似于{:filter\u by=>params[:filter\u by],…},:remote=>true%>
。您可能想使用一个helper方法,该方法检查参数是否已实际设置等。我怀疑是否已将参数传递给index方法(第一次尝试时不知何故我失败了),但在您的帖子之后,我再次尝试了该方法,并且。。。它有效。:)