2

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

<%= paginate @rooms, :params => {:controller => 'rooms', :action => 'index'}, :remote => true %>

但随后变量@rooms 在索引中被重置,我再次对未过滤的数据进行分页。

任何想法我该如何解决?

这是一些代码

  • 房间控制器.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>
    
4

1 回答 1

3

通过再次将参数传递给索引并强制分页路由到“rooms#index”而不是当前页面来解决问题(虽然不是 Ajax 的可见原因)。

  • _rooms_list.html.erb

    <%= paginate @rooms, :params => {:controller => 'rooms', :action => 'index'}, :remote => true %>
    

参数通过 GET 从当前参数变量传递到索引。

  • 房间控制器.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 当然是删除/重命名。我将一些我认为不应该在分页时传递到下一页的参数归零。

于 2011-11-01T09:22:29.730 回答