2011-10-31 21 views
2

ページ分割にKaminariプラグインを使用しています。私は自分のアプリケーションをAjaxifingしていて、問題が発生しました。私は、データをフィルタリングするためのフォーム付きのデータとページングされたデータ(両方ともAjax経由)を持っています。開始ページ付けはうまく動作し、特定のページのURLは '/ admin/rooms?page = X'です。 ajaxが '/ admin/rooms/filter?page = X'のURLの変更をフィルタリングした後。 私はでページ付けたときにトリガするアクションを指定することができます。RailsでAjaxを呼び出した後でページネーションが機能しない

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

が、その後、変数@roomsはインデックスにresetted取得し、私は再びフィルタリングされていないデータをページ付け。

どうすればいいですか?

ここではいくつかのコード

  • rooms_controller.rbです: 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> 
    
  • _rooms_list.html.erb:インデックスに再びパラメータを渡すと「部屋番号のインデックス」へのルートにページ付け強制することで解決

    <div id="paginator"> 
         <%= paginate @rooms, :remote => true %> 
    </div> 
    <table class="table_listing" style="width: 60%"> 
         ... 
    </table> 
    
+0

これは本当に推測です(今のところ答えはありません)が、あなたのコードを見て、私は '#paginate'ビューメソッドのKaminariの' params'属性を通してフィルタ変数を渡さなければならないと思います。 '<%= paginate @rooms、:params => {:filter_by => params [:filter_by]、...}、:remote => true%>'のようなものです。 – polarblau

+0

私はインデックスメソッドに引数を渡すことに疑問を抱いていましたが(何とか最初の試みでこれに失敗しました)、私はもう一度それに行きましたあなたのポストの後に...それは動作します。 :) – Dedemonn

答えて

3

問題ではなく、現在のページ(ただしアヤックスの見えない原因) 。

  • _rooms_list.html.erb

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

Parametrs本paramsは変数からGETによってインデックスに渡されます。

  • 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はもちろん、名前の変更/削除することです。私は、ページングするときに次のページにparamsで渡すべきではないと思ういくつかのパラメータを無視します。

関連する問題