Jquery 在Rails中调用Ajax后分页不起作用

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

我正在使用插件Kaminari进行分页。我正在修改我的应用程序,遇到了一个问题。我有一个带有分页数据的表单,还有一个用于过滤数据的表单(都是通过Ajax)。开始时,分页工作正常,特定页面的url为“/admin/rooms?page=X”。在ajax过滤完这些url对“/admin/rooms/filter?page=X”的更改之后。 我可以通过以下方式指定分页时要触发的操作:

<%= 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
    
    
    正确%>
    ...
    

通过再次将参数传递到索引并强制paginate路由到“rooms#index”,而不是当前页面,问题得到了解决(但Ajax的原因不可见)

  • \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方法(第一次尝试时不知何故我失败了),但在您的帖子之后,我再次尝试了该方法,并且。。。它有效。:)