Paginate without a gem Next, Previous, buttons for Name.order(:id).limit(10).offset(0)

前端 未结 2 415
青春惊慌失措
青春惊慌失措 2021-01-21 12:57

I\'ve been searching for a solution to my problem for over a week now. I have an assignment that I lost 10 pts on due to no next/prev functionality and ran out of time. I still

相关标签:
2条回答
  • 2021-01-21 13:22

    How about this?

    class RipplesController < ApplicationController  
      before_filter :set_page, only: [:index]
      RIPPLES_PER_PAGE = 10
      def index   
        @ripples = Ripple.order(:id).limit(RIPPLES_PER_PAGE).offset(@page * RIPPLES_PER_PAGE) 
      end
      private
        def set_page
           @page = params[:page].to_i || 0
        end
    end
    

    Then in the view links will be

    <div id = "nav">
        <button><%= link_to 'Newest', ripples_path %></button>
        <button><%= link_to 'Previous 10 Ripples', ripples_path(page: @page - 1) %></button>
        <button><%= link_to "Next 10 Ripples", ripples_path(page: @page + 1) %></button>
    </div>
    

    All of this will be driven through the RipplesController#index method and will use URL's like /ripples?page=1, /ripples?page=2, etc.

    These link_to calls will generate links with GET variables so that you can access them in the params hash and use them to drive the results returned.

    0 讨论(0)
  • 2021-01-21 13:32

    A few things here. Firstly, controller methods should be used with matching routes. It's a request cycle where you click a button on your app, it makes a request to your server, then your server response with information.

    Your next_button method is not going to work when you put it as a helper_method this way. In order to make your controller work, you should have routes that match to your controller method. Do a rake routes in your command line. You need to see something like this in your route.rb file

    get 'ripple/next', 'ripple#next'
    

    More about routes: http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing

    And in your controller, you could have

    def next
      page = params[:page]
      params[:page] += 1
      @ripples = Ripple.find_ripples_on_page(page, PAGE_SIZE)
      render :index
    end
    

    Then in your erb view, your should be 'visiting' this particular route, not calling the method.

    Secondly, you can not rely on class instance variable in your model. Instead, you should put it in your session or as part of a query string. As above controller code, I put it in session, which is a local storage. More about session: http://guides.rubyonrails.org/action_controller_overview.html#session

    Finally, your model.

    def find_ripples_on_page(page, PAGE_SIZE)
      Ripple.where( ... ) # you can figure this out, depending on if you want to rank by updated_at or other filter
    end
    

    Side note: helper_method in controller is for retrieving information not giving command to the controller. All this macro does is use class_eval and 'copy' the method you have in controller into the renderer.

    If you can use a gem, use will_paginate.

    http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing

    0 讨论(0)
提交回复
热议问题