学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Rails6.0 | 仕事売買サイトの構築 |35 | ページネーション

[34]検索の実装 << [ホームに戻る] >> [36]ホームページ


検索ページにページング機能をつけます。


「GemFile」に以下の記述を追加します。


記述追加 GemFile(77行目)

gem 'kaminari'



GemFile

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.3'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.3'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 4.1'
# Use SCSS for stylesheets
gem 'sass-rails', '>= 6'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Active Storage variant
# gem 'image_processing', '~> 1.2'

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.2', require: false

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '~> 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  # Easy installation and use of web drivers to run system tests with browsers
  gem 'webdrivers'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

# Bulma
gem 'bulma-rails', '~> 0.7.4'
gem 'bulma-extensions-rails', '~> 1.0.30'

#デバイス
gem 'devise'

# 日本語化
gem 'rails-i18n'

# facebook認証
gem 'omniauth', '= 1.9.0'
gem 'omniauth-facebook', '= 5.0.0'

# amazon s3
gem "aws-sdk"

# faker
gem 'faker', '=1.9.3'

#ページネーション
gem 'kaminari'



コマンド(2つ)
bundle


rails g kaminari:views bulma


「app\controllers\pages_controller.rb」ファイルに以下の記述を追加します。


記述追加 app\controllers\pages_controller.rb(43,44行目)

                .page(params[:page])
                .per(6)



app\controllers\pages_controller.rb

class PagesController < ApplicationController

  def home
  end

  def search
    @categories = Category.all
    @category = Category.find(params[:category]) if params[:category].present?
    @q = params[:q]
    @min = params[:min]
    @max = params[:max]
    @delivery = params[:delivery].present? ? params[:delivery] : "0"
    @sort = params[:sort].present? ? params[:sort] : "price asc"
    query_condition = []
    query_condition[0] = "gigs.active = true"
    query_condition[0] += " AND ((gigs.has_single_pricing = true AND pricings.pricing_type = 0) OR (gigs.has_single_pricing = false))"
    if !@q.blank?
      query_condition[0] += " AND gigs.title ILIKE ?"
      query_condition.push "%#{@q}%"
    end
    if !params[:category].blank?
      query_condition[0] += " AND category_id = ?"
      query_condition.push params[:category]
    end
    if !params[:min].blank?
      query_condition[0] += " AND pricings.price >= ?"
      query_condition.push @min
    end
    if !params[:max].blank?
      query_condition[0] += " AND pricings.price <= ?"
      query_condition.push @max
    end
    if !params[:delivery].blank? && params[:delivery] != "0"
      query_condition[0] += " AND pricings.delivery_time <= ?"
      query_condition.push @delivery
    end
    @gigs = Gig
                .select("gigs.id, gigs.title, gigs.user_id, MIN(pricings.price) AS price")
                .joins(:pricings)
                .where(query_condition)
                .group("gigs.id")
                .order(@sort)
                .page(params[:page])
                .per(6)
  end
  
end



「app\views\pages\search.html.erb」ファイルに以下の記述を追加します。


記述追加 app\views\pages\search.html.erb(105行目)

<%= paginate @gigs %>



app\views\pages\search.html.erb

<%= render 'shared/categories' %>

<section class="section">
    <div class="container">

        <!-- 上部 -->
        <div class="card m-b-20">
            <div class="card-header">

                <!-- カテゴリー -->
                <div class="card-header-title">
                    カテゴリー <% if @category %><%= @category.name %> <% end %>
                </div>

                <!-- 並び替え -->
                <%= form_tag '', method: :get do %>
                    <%= hidden_field_tag 'category', @category ? @category.id : '' %>
                    <div class="field p-10">
                        <div class="select">
                            <%= select_tag 'sort', options_for_select(
                                [
                                    ['価格の低い順', 'price asc'],
                                    ['価格の高い順', 'price desc'],
                                    ['最新のものから', 'gigs.created_at desc'],
                                    ['古いものから', 'gigs.created_at asc']
                                ], selected: @sort
                            ), onchange: "this.form.submit();" %>
                        </div>
                    </div>  
                <% end %>            
            </div>
        </div>
        
        <div class="columns">

            <!-- 左側 -->
            <div class="column is-one-quarter">
                <div class="columns is-multiline">
                    <div class="column is-full">
                        <div class="card">
                            <div class="card-content">
                                <%= form_tag '', method: :get do %>
                                    <%= hidden_field_tag 'category', @category ? @category.id : '' %>
                                    <%= hidden_field_tag 'sort', @sort %>
                                                                    
                                    <!-- タイトル検索 -->
                                    <div class="field">
                                        <%= text_field_tag 'q', @q || '', class: "input", placeholder: "タイトルで検索" %>
                                    </div>
                                    <hr/>
                                    <!-- 価格帯 -->
                                    <label class="label">価格帯</label>
                                    <div class="field has-addons">
                                        <p class="control">                                            
                                            <%= number_field_tag 'min', @min || '', class: "input", placeholder: "最低" %>                                        
                                        </p>
                                        <p class="control">
                                            <a class="button is-static"></a>
                                        </p>
                                    </div>
                                    <div class="field has-addons">
                                        <p class="control">
                                            <%= number_field_tag 'max', @max || '', class: "input", placeholder: "最高" %>
                                        </p>
                                        <p class="control">
                                            <a class="button is-static"></a>
                                        </p>
                                    </div>
                                    <hr/>
                                    <!-- 期日 -->
                                    <label class="label">期日</label>                                    
                                    <%= radio_button_tag 'delivery', "1", checked = "1" == @delivery %> 1日以上 <br>
                                    <%= radio_button_tag 'delivery', "3", checked = "3" == @delivery %> 3日以上 <br>
                                    <%= radio_button_tag 'delivery', "7", checked = "7" == @delivery %> 7日以上 <br>
                                    <%= radio_button_tag 'delivery', "10", checked = "10" == @delivery %> 10日以上 <br>
                                    <%= radio_button_tag 'delivery', "15", checked = "15" == @delivery %> 15日以上 <br>
                                    <%= radio_button_tag 'delivery', "0", checked = "0" == @delivery %> 全て
                                    <hr/>
                                    
                                    <!-- 下部 -->
                                    <div class="field m-t-20">
                                        <button  class="button is-danger is-fullwidth" type="submit"> 検索</button>
                                    </div>
                                <% end %>
                                <div class="field m-t-10">
                                    <%= form_tag '', method: :get do %>
                                        <button  class="button is-black is-outlined is-fullwidth" type="submit"> 検索条件のクリア</button>
                                    <% end %>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            
            <!-- 右側 -->
            <div class="column infinite-list">
                <!-- お仕事のリスト -->
                <div class="columns is-multiline">
                    <%= render partial: 'shared/gigs', object: @gigs %>
                </div>
                <!-- ページネーション -->
                <div class="card">
                    <div class="card-header-title is-centered">
                        <%= paginate @gigs %>
                    </div>
                </div>
            </div>
        </div>
        
    </div>
</section>



ブラウザ確認
http://localhost:3000/search

ページネーション
ページネーション



↓↓クリックして頂けると励みになります。


[34]検索の実装 << [ホームに戻る] >> [36]ホームページ